%{ int names[26]; %} %token NUMBER NAME PLUS MINUS STAR DIV LPAR RPAR EQUALS %% stmt_lst: stmt '\n' | stmt_lst stmt '\n' ; stmt : NAME EQUALS expr { $$ = $3; printf("=> %d\n", $3); names[$1]=$3; } | expr { $$ = $1; printf("=> %d\n", $1); } ; expr : expr PLUS term { $$ = $1 + $3; } | expr MINUS term { $$ = $1 - $3; } | term { $$ = $1; } ; term : term STAR prim { $$ = $1 * $3; } | term DIV prim { if ($3 == 0) { yyerror("divide by zero"); exit(1); } else $$ = $1 / $3; } | prim { $$ = $1; } ; prim : LPAR expr RPAR { $$ = $2; } | MINUS prim { $$ = - $2; } | NUMBER { $$ = $1; } | NAME { $$ = names[yylval]; } ; %%