%{ /********* * Simple lexical analysis file - * * Note: the use of token(INDEX) is only for Tokentrace - see * the routine yaccextras.c * also allows us to obtain a listing from lex */ #include "booldef.h" #include "y-tab.h" extern int token(); extern int DumpSymTab(); %} letter [a-zA-Z_] digit [0-9] letter_or_digit [a-zA-Z_0-9] white_space [ \t\n] blank [ \t] comment "--"[^\n]*\n string \"([^\n\"]|\"\")*\" other . %% "%%c" {token(NULL); Gencode = !Gencode;} "%%t" {token(NULL); Tokentrace = !Tokentrace;} "%%pr" {token(NULL); PtraceSem = !PtraceSem;} "%%ss" {token(NULL); Semstacktrace = !Semstacktrace;} "%%dmp" {token(NULL); DumpSymTab();} [Rr][Ee][Aa][Dd][Ll][Nn] return token( Readln ); [Ww][Rr][Ii][Tt][Ee] return token( Write ); [Ww][Rr][Ii][Tt][Ee][Ll][Nn] return token( Writeln ); [Ii][Ff] return token ( If ); [Tt][Hh][Ee][Nn] return token ( Then ); [Ee][Nn][Dd] return token ( End ); "=" return token ( Eqop ); ":=" return token( Assignop ); "(" return token( Lparen ); ")" return token( Rparen ); "+" return token( Plussym ); "-" return token( Minussym ); "*" return token( Mpysym ); "/" return token( Divsym ); "," return token( Commasym ); ";" return token( Termsym ); {letter}{letter_or_digit}* return token( Id ); {digit}{digit}* return token( Iconst ); {white_space}{white_space}* token(NULL); {comment} token(NULL); {string} return token( Strconst ); {other} /*return yytext[0];*/ lexerr(); %% int lexerr() /* inform user of error and return the string being scanned */ { fputs ("\nERROR in Lex: \n",stdout); fprintf (stdout,"%s\n",yytext); } /* Strip unwanted quotes from string in yytext; adjust yyleng */ int stripquotes (char * yytext) { int frompos, topos = 0, numquotes = 2; for (frompos = 1; frompos < yyleng; frompos++) { if (yytext[frompos] == 0x22 && yytext[frompos+1] == 0x22) { yytext[topos++] = '\\'; yytext[topos++] = yytext[frompos++]; } else yytext[topos++] = yytext[frompos]; } yyleng -= numquotes; yytext[yyleng] = '\0'; }