%{ #include %token ANDSY ARRAYSY BECOMES BEGINSY CASESY IDIV DOSY DOWNTOSY ELSESY ENDSY IDIV %token DOSY DOWNTOSY ELSESY ENDSY FORSY FUNCTIONSY IFSY NOTSY OFSY ORSY PROCEDURESY %token PROGRAMSY RECORDSY REPEATSY THENSY TOSY TYPESY UNTILSY VARSY WHILESY %token IDENT EGL GEG GTR LEG LSS NEW PLUS MINUS RDIV TIMES LBRACK RBRACK LPAREN RPAREN %token BECOMES COLON COMMA DOT SEMICOLON STRINGT INTCON REALCON int line_no = 1; %} A [aA] B [bB] C [cC] D [dD] E [eE] F [fF] G [gG] H [hH] I [iI] J [jJ] K [kK] L [lL] M [mM] N [nN] O [oO] P [pP] Q [qQ] R [rR] S [sS] T [tT] U [uU] V [vV] W [wW] X [xX] Y [yY] Z [zZ] NQUOTE [^'] %% {A}{N}{D} return(ANDSY); {A}{R}{R}{A}{Y} return(ARRAYSY); {C}{A}{S}{E} return(CASESY); {C}{O}{N}{S}{T} return(CONSTSY); {D}{I}{V} return(IDIV); {D}{O} return(DOSY); {D}{O}{W}{N}{T}{O} return(DOWNTOSY); {E}{L}{S}{E} return(ELSESY); {E}{N}{D} return(ENDSY); {F}{O}{R} return(FORSY); {F}{U}{N}{C}{T}{I}{O}{N} return(FUNCTIONSY); {I}{F} return(IFSY); {M}{O}{D} return(IMOD); {N}{O}{T} return(NOTSY); {O}{F} return(OFSY); {O}{R} return(ORSY); {B}{E}{G}{I}{N} return(BEGINSY); {P}{R}{O}{C}{E}{D}{U}{R}{E} return(PROCEDURESY); {P}{R}{O}{G}{R}{A}{M} return(PROGRAMSY); {R}{E}{C}{O}{R}{D} return(RECORDSY); {R}{E}{P}{E}{A}{T} return(REPEATSY); {T}{H}{E}{N} return(THENSY); {T}{O} return(TOSY); {T}{Y}{P}{E} return(TYPESY); {U}{N}{T}{I}{L} return(UNTILSY); {V}{A}{R} return(VARSY); {W}{H}{I}{L}{E} return(WHILESY); [a-zA-Z]([a-zA-Z0-9])+ return(IDENT); "=" return(EGL); ">=" return(GEG); ">" return(GTR); "<=" return(LEG); "<" return(LSS); "<>" return(NEG); “#” return(NEG); "+" return(PLUS); "-" return(MINUS); "/" return(RDIV); "*" return(TIMES); "[" return(LBRACK); "]" return(RBRACK); "(" return(LPAREN); ")" return(RPAREN); ":=" return(BECOMES); ".." return(COLON); ":" return(COLON); // extension over what Wirth handles in Pascal-S "," return(COMMA); "." return(DOT); ";" return(SEMICOLON); '({NQUOTE}|'')+' return(STRINGT); ([0-9])+ return(INTCON); ([0-9])+".“([0-9])* return(REALCON); "(*" | "{" { register int c; while ((c = input())) { if (c == '}') break; else if (c == '*') { if ((c = input()) == ')') break; else unput (c); } else if (c == '\n') line_no++; else if (c == 0) commenteof(); } } [ \t\f] ; \n line_no++; . fprintf (stderr, "'%c' (0%o): illegal character at line %d\n", yytext[0], yytext[0], line_no); %% commenteof() { fprintf (stderr, "unexpected EOF inside comment at line %d\n", line_no); exit (1); } yywrap () { return (1); }