calc.y (750B)
1 %{ 2 #define YYSTYPE double 3 #include <stdio.h> 4 // yylex() is generated by flex 5 int yylex(void); 6 // we have to define yyerror() 7 int yyerror (char const *); 8 9 %} 10 %token NUMBER 11 12 %left '+' '-' 13 %left '*' '/' 14 %right '(' 15 16 %% 17 stmtlist: statement '\n' stmtlist { 18 printf("done with statement equal to [%g]\n", $1); 19 } | // EMPTY RULE i.e. stmtlist -> nil 20 { printf("DONE\n") ;}; 21 22 statement: expression { printf("VALUE=%g\n",$1); }; 23 24 expression: expression '+' expression { $$ = $1 + $3; } | 25 expression '-' expression { $$ = $1 - $3; } | 26 expression '*' expression { $$ = $1 * $3; } | 27 expression '/' expression { 28 if($3 !=0) { $$ = $1 / $3; } else 29 { printf("div by zero\n"); $$=0;} } | 30 '(' expression ')' { $$ = $2; } | 31 NUMBER { $$ = $1; } ; 32 33 %%