[net.nlang.greek] Greek Typesetting #5 - Programa Manwli Kateveni - rules.l

panos@utcsri.UUCP (Panos Economopoulos) (11/05/85)

%START LAT GRK
%{
#include "accents.h"
%}
%%
	char prevMo='L'; /* previous "Mode": 'L' (LAT), or 'G' (GRK) */
	int capToAcc=0;  /* flag: convert next capital to accented */
	BEGIN LAT;	 /* default "font" is LAT (latin) */

^".".*		{ ECHO;
	/* full-line troff commands get echoed; there is NO translation
	 *  of their arguments.  .ft-type commands get caught below,
	 *  because that is a longer match  */
	/* in-line troff commands (except for \f[RBIP] -- see below)
	 *  are NOT understood, and will get translated, in GRK-mode;
	 *  this will usually ruin them */
		}

<LAT>\\fG		|
<LAT>^\.("ft ")?G\n	{ prevMo='L'; BEGIN GRK; }
<GRK>\\fG		|
<GRK>^\.("ft ")?G\n	{ prevMo='G'; }

<LAT>\\fL		|
<LAT>^\.("ft ")?L\n	{ prevMo='L'; }
<LAT>\\f[RBI]		|
<LAT>^\.("ft ")?[RBI]\n	{ prevMo='L'; ECHO; }

<GRK>\\fL		|
<GRK>^\.("ft ")?L\n	{ prevMo='G'; BEGIN LAT; }
<GRK>\\f[RBI]		|
<GRK>^\.("ft ")?[RBI]\n	{ prevMo='G'; BEGIN LAT; ECHO;}

<LAT>\\fP		|
<LAT>^\.ft(" P")?\n	{ if (prevMo=='G') BEGIN GRK;
			  ECHO;
	/* restore BOTH the previous mode (LAT/GRK),
	 *  and the previous latin font (R, B, or I) */
			}
<GRK>\\fP		|
<GRK>^\.ft(" P")?\n	{ if (prevMo=='L') BEGIN LAT;
	/* restore ONLY the previous mode (LAT/GRK) */
			}


<GRK>([a-z]|ii|th|ch|ps|Ii|Th|Ch|Ps)[AEHIOYUW]	{ capToAcc=1; REJECT;
	/* set flag to interpret upper-case letter as accented lower-
	 *  case one, and then go back to normal processing */
						}
<GRK>a		fputs("\\(*a", stdout);
<GRK>v|b	fputs("\\(*b", stdout);
<GRK>g		fputs("\\(*g", stdout);
<GRK>d		fputs("\\(*d", stdout);
<GRK>e		fputs("\\(*e", stdout);
<GRK>z		fputs("\\(*z", stdout);
<GRK>ii|h	fputs("\\(*y", stdout);
<GRK>th		fputs("\\(*h", stdout);
<GRK>i		fputs("\\(*i", stdout);
<GRK>k		fputs("\\(*k", stdout);
<GRK>l		fputs("\\(*l", stdout);
<GRK>m		fputs("\\(*m", stdout);
<GRK>n		fputs("\\(*n", stdout);
<GRK>x		fputs("\\(*c", stdout);
<GRK>o		fputs("\\(*o", stdout);
<GRK>p		fputs("\\(*p", stdout);
<GRK>r		fputs("\\(*r", stdout);
<GRK>s/[a-zAEHIOYUW']	fputs("\\(*s", stdout);
<GRK>s/[^a-zAEHIOYUW']	{
#ifdef IMAGEN
	ECHO;	/* the Imagen laser-printer has no terminal-sigma(!) */
#else
	fputs("\\(ts", stdout);
#endif
			}
<GRK>t		fputs("\\(*t", stdout);
<GRK>y|u	fputs("\\(*u", stdout);
<GRK>f		fputs("\\(*f", stdout);
<GRK>ch		fputs("\\(*x", stdout);
<GRK>ps		fputs("\\(*q", stdout);
<GRK>w		fputs("\\(*w", stdout);


<GRK>A		{ if (capToAcc) { fputs(aAcc, stdout); capToAcc=0; }
		  else putchar('A');
		}
<GRK>B|V	fputs("\\(*B", stdout);
<GRK>G		fputs("\\(*G", stdout);
<GRK>D		fputs("\\(*D", stdout);
<GRK>E		{ if (capToAcc) { fputs(eAcc, stdout); capToAcc=0; }
		  else putchar('E');
		}
<GRK>II|Ii|H	{ if (capToAcc) { fputs(hAcc, stdout); capToAcc=0; }
		  else putchar('H');
		}
<GRK>TH|Th	fputs("\\(*H", stdout);
<GRK>I		{ if (capToAcc) { fputs(iAcc, stdout); capToAcc=0; }
		  else putchar('I');
		}
<GRK>L		fputs("\\(*L", stdout);
<GRK>X		fputs("\\(*C", stdout);
<GRK>O		{ if (capToAcc) { fputs(oAcc, stdout); capToAcc=0; }
		  else putchar('O');
		}
<GRK>P		fputs("\\(*P", stdout);
<GRK>R		putchar('P');
<GRK>S		fputs("\\(*S", stdout);
<GRK>Y|U	{ if (capToAcc) { fputs(uAcc, stdout); capToAcc=0; }
		  else fputs("\\(*U", stdout);
		}
<GRK>F		fputs("\\(*F", stdout);
<GRK>CH|Ch	putchar('X');
<GRK>PS|Ps	fputs("\\(*Q", stdout);
<GRK>W		{ if (capToAcc) { fputs(wAcc, stdout); capToAcc=0; }
		  else fputs("\\(*W", stdout);
		}


<GRK>'a		fputs(aAcc, stdout);
<GRK>'e		fputs(eAcc, stdout);
<GRK>'ii|'h	fputs(hAcc, stdout);
<GRK>'i		fputs(iAcc, stdout);
<GRK>'o		fputs(oAcc, stdout);
<GRK>'y|'u	fputs(uAcc, stdout);
<GRK>'w		fputs(wAcc, stdout);

<GRK>'A		fputs(AAcc, stdout);
<GRK>'E		fputs(EAcc, stdout);
<GRK>'II|'Ii|'H	fputs(HAcc, stdout);
<GRK>'I		fputs(IAcc, stdout);
<GRK>'O		fputs(OAcc, stdout);
<GRK>'Y|'U	fputs(UAcc, stdout);
<GRK>'W		fputs(WAcc, stdout);

<GRK>:i:	fputs(iDial, stdout);
<GRK>:y:|:u:	fputs(uDial, stdout);
<GRK>:'i:	fputs(iDiAc, stdout);
<GRK>:'y:|:'u:	fputs(uDiAc, stdout);
<GRK>:I:	fputs(IDial, stdout);
<GRK>:Y:|:U:	fputs(UDial, stdout);
-- 

					Panos Economopoulos

UUCP:   {decvax,linus,ihnp4,uw-beaver,allegra,utzoo}!utcsri!panos
CSNET:  panos@toronto