5 #include "Exception.hpp"
11 // better error reporting
12 #define YYERROR_VERBOSE
14 // bison requires that you supply this function
15 void yyerror(const char *msg)
17 std::cerr << "ERROR(PARSER): " << msg << std::endl;
28 %token <dvalue> DOUBLE
29 %token <ivalue> INTEGER
32 %type <expr> dexpression
35 %type <expr> iexpression
40 statementlist : statement '\n'
41 | statement '\n' statementlist
44 statement : dexpression { std::cout << "ANS" << $1->eval() << std::endl; }
45 | iexpression { std::cout << "ANS" << $1->eval() << std::endl; }
48 number : DOUBLE {$$ = new Number(double($1)); }
49 | INTEGER {$$ = new Number(double($1)) ; }
51 dexpression: dexpression '+' number { $$ = new AddExpr($1, $3); }
52 | iexpression '+' dterm { $$ = new AddExpr($1, $3); }
56 iexpression: iexpression '+' iterm { $$ = new AddExpr($1, $3);}
60 dterm : dterm '*' number { $$ = new MulExpr($1, $3); }
61 | iterm '*' DOUBLE { $$ = new MulExpr($1, new Number($3)); }
63 | dterm '/' DOUBLE { if ($3==0) {
67 $$ = new DivExpr($1, new Number($3));
70 | dterm '/' INTEGER { if ($3==0) {
74 $$ = new DivExpr($1, new Number(long($3)));
77 | iterm '/' DOUBLE { if ($3==0) {
81 $$ = new DivExpr($1, new Number(double($3)));
84 | DOUBLE { $$ = new Number(double($1)); }
87 iterm : iterm '*' INTEGER { $$ = new MulExpr($1, new Number(long($3))); }
88 | iterm '/' INTEGER { if ($3==0) {
92 $$ = new DivExpr($1, new Number(long($3)));
95 | INTEGER { $$ = new Number(long($1)); }