www.pudn.com > interpreter.zip > interpreter.l


%{
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);
}