%{ extern void lexerror(); int strcnt = 0; #define STRSIZE 80 char string[STRSIZE +1] = {0}; extern char *putstring(); %} %start STR COMM %% "+" return (ADDOP); "-" return (SUBOP); "*" return (MULOP); "/" return (DIVOP); "=" return (ASGNOP); "<" return (LTOP); "{" return (LC); "}" return (RC); "(" return (LP); ")" return (RP); ";" return (SC); \" { strcnt = 0; BEGIN STR; } "/*" BEGIN COMM; while return(WHILE); printstr return(PRINTSTR); printvar return(PRINTVAR); x[0-9]+ { sscanf ( &yytext[1], "%d", &yylval.xnum); if (yylval.xnum > VAR_LEN) lexerror("variable invalid: ", yytext,1); return (VAR); } [0-9]+\.[0-9]*|[0-9]+ { sscanf (yytext,"%lf", &yylval.floating); return (NUMBER); } [ \t\n] ; [a-zA-Z0-9]+ lexerror ("word invalid: ", yytext, 0); . lexerror("character invalid: ", yytext, 0); \" { if ( strcnt >= STRSIZE ) { string[STRSIZE] = '\0'; strcnt = STRSIZE; lexerror ( "string too long: ", string, 0); } string[strcnt] = '\0'; yylval.str = putstring (string); BEGIN INITIAL; return (STRING); } \\n { if ( strcnt < STRSIZE ) string[strcnt++] = '\n'; } \n { string[strcnt] = '\0'; lexerror ("string not closed: ", string, 0); yylval.str = putstring (string); BEGIN INITIAL; return (STRING); } . { if ( strcnt < STRSIZE ) string[strcnt++] = yytext[0]; } "*/" BEGIN INITIAL; \n ; . ; %% void lexerror ( char *s0, char *s1, int n ) { fprintf(stderr, "%s%s", s0, s1); if (n) exit(0); }