/* * The file "calc.y": Parser definitions * Contains the grammar rules and semantic actions. * Used by bison as an input file. */ /*========== 1. The Definition Section ==============================*/ %{ #include #include #include #include /* The file "parser.h" contains the definition of YYSTYPE: */ /* the type of values in the semantic stack of parser */ #include "parser.h" /* Any C++ code may be added here... */ %} %term INT_CONST DOUBLE_CONST NAME %term ENDL LPAR RPAR ILLEGAL %left PLUS MINUS %left MULT DIV %nonassoc UMINUS /* Fictive lexeme for unary minus */ %% /*========== 2. The Grammar Section =========================================*/ /* Program is a sequence of lines containing expressions */ program : line | program line ; /* Line is an expression followed by the "end line" character */ line : e ENDL { /* print the value of expression */ printf("= %lf\n", $1.double_value); } | ENDL { return 0; } /* exit on empty line */ | error ENDL {} /* error recovery on end line */ ; /* Expression */ e : e PLUS e { $$.double_value = $1.double_value + $3.double_value; } | e MINUS e { $$.double_value = $1.double_value - $3.double_value; } | e MULT e { $$.double_value = $1.double_value * $3.double_value; } | e DIV e { $$.double_value = $1.double_value / $3.double_value; } | MINUS e %prec UMINUS { $$.double_value = (-$2.double_value); } | PLUS e { $$.double_value = $2.double_value; } | LPAR e RPAR { $$.double_value = $2.double_value; } | INT_CONST { $$.double_value = (double) $1.int_value; } | DOUBLE_CONST { $$.double_value = $1.double_value; } ; %% /*================ 3. The Program Section ================================*/ int main() { printf("Enter an expression to evaluate (empty line for quit):\n"); yyparse(); return 0; } /* Parse error diagnostics */ int yyerror(const char *s) { printf("%s\n", s); return 0; }