%{ #include void yyerror(char *); #include"y.tab.h" %} %% [0-9]+ { yylval = atoi(yytext); return INTEGER; } [-+*/\n] return *yytext; [ \t] ;/*skip whitespace*/ . yyerror("invalid character"); %% int yywrap(void){ return 1; } %{ #include int yylex(void); void yyerror(char *); %} %left '+' '-' %left '*' '/' %token INTEGER %% program: program expr '\n' {printf("%d\n", $2);} | ; expr: INTEGER {$$ = $1;} | expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$= $1 - $3;} | expr '*' expr {$$= $1 * $3;} | expr '/' expr { if($3==0) yyerror("divided by zero\n"); else $$=$1/$3; } ; %% void yyerror(char *s){ fprintf(stderr, "%s\n", s); } int main(void){ yyparse(); return 0; }