%{ #include #include int yylex(void); int yyerror(char *s); #define YYSTYPE double // data type of yacc stack %} %token NUMBER %left '+' '-' // left associative, same precedence %left '*' '/' // left associative, higher precedence %% exprlist: /* empty list */ | exprlist '\n' | exprlist expr '\n' {printf("\t= %lf\n", $2);} ; expr: NUMBER {$$ = $1;} | expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$ = $1 - $3;} | expr '*' expr {$$ = $1 * $3;} | expr '/' expr {$$ = $1 / $3;} | '(' expr ')' {$$ = $2;} ; %% char *progname; // for error message int lineno=1; int main(int argc, char *argv[]) { progname=argv[0]; yyparse(); return 0; } // Print a warning messsage. int warning(char *s, char *t) { fprintf(stderr, "*** %s: %s", progname, s); if (t) fprintf(stderr, " %s", t); fprintf(stderr, " near line %d\n",lineno); return 0; } // Called for yacc syntax errors. int yyerror(char *s) { warning(s, (char *) 0); return 0; }