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