Line data Source code
1 : %skeleton "lalr1.cc" /* -*- C++ -*- */
2 : %require "2.4"
3 : %defines
4 : %define parser_class_name {Eval_parser}
5 :
6 : %code requires {
7 : #include <math.h>
8 : #include <limits.h>
9 : # include <string>
10 :
11 : #include <fstream>
12 : #include <sstream>
13 : #include <set>
14 : class Eval;
15 :
16 : using namespace std;
17 :
18 : }
19 :
20 : // The parsing context.
21 : %parse-param { Eval& Evaluate }
22 : %lex-param { Eval& Evaluate }
23 :
24 : %locations
25 :
26 : %debug
27 : %error-verbose
28 :
29 : // Symbols.
30 : %union
31 : {
32 : double RealVal;
33 : int IntVal;
34 : std::string *name;
35 :
36 : };
37 :
38 : %code {
39 : #include "Eval.hpp"
40 : #include <set>
41 : #include <vector>
42 :
43 : }
44 :
45 : %token END 0 "end of file"
46 :
47 : %token <name> str
48 : %token <RealVal> rval
49 : %token <IntVal> ival
50 :
51 : %token <name> MIN
52 : %token <name> MAX
53 : %token <name> FLOOR
54 : %token <name> PLUS
55 : %token <name> MINUS
56 : %token <name> MUL
57 : %token <name> DIV
58 : %token <name> POWER
59 : %token <name> LB
60 : %token <name> RB
61 : %token <name> COMMA
62 : %token <name> DOUBLE
63 :
64 : %type<RealVal> exp
65 :
66 :
67 :
68 0 : %printer { debug_stream () << *$$; } str
69 10 : %destructor { delete $$; } str
70 :
71 0 : %printer { debug_stream () << $$; } <IntVal>
72 0 : %printer { debug_stream () << $$; } <RealVal>
73 :
74 : %%
75 :
76 : %left PLUS MINUS;
77 : %left NEG;
78 : %left MUL DIV;
79 : %left POWER;
80 : %left DOUBLE;
81 : %start ArithmethicExp;
82 518 : ArithmethicExp:exp {Evaluate.IntResult=(int) $1;Evaluate.RealResult=$1;};
83 : exp:
84 458 : ival {$$=$1;}
85 72 : |rval {$$=$1;}
86 0 : |LB exp RB {$$=$2;}
87 0 : |MINUS exp %prec NEG {$$=-$2;}
88 0 : |exp PLUS exp{$$=$1+$3;}
89 2 : |exp MUL exp{$$=$1*$3;}
90 0 : |exp MINUS exp{$$=$1-$3;}
91 0 : |DOUBLE exp {$$=double($2);}
92 0 : |exp DIV exp {if($3==0) {cout<<"Division by zero !";YYABORT;}
93 0 : else $$=$1/double $3;
94 : }
95 0 : |exp POWER exp {$$=pow($1,$3);}
96 0 : |MIN LB exp COMMA exp RB {if($3<=$5) $$=$3; else $$=$5;}
97 0 : |MAX LB exp COMMA exp RB {if($3>=$5) $$=$3; else $$=$5;}
98 0 : |FLOOR LB exp RB {$$=floor($3);}
99 :
100 : %%
101 :
102 : void
103 10 : eval::Eval_parser::error (const eval::Eval_parser::location_type& l,
104 : const std::string& m)
105 : {
106 10 : Evaluate.error (l, m);
107 115 : }
|