%token INTEGER VARIABLE %left '+' '-' %left '*' '/' %{ #include void yyerror(char *); int yylex(void); int sym[26]; FILE *yyin; %} %% program: program statement '\n' |error '\n' { yyclearin;yyerrok;printf("error in");} | ; statement: |expr { printf("%d\n", $1); } | VARIABLE '=' expr { sym[$1] = $3; } ; expr: INTEGER | VARIABLE { $$ = sym[$1]; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } ; %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); return; } int main(void) { yyin=fopen("inp.dat","r"); yyparse(); return 0; }