xref: /minix3/external/bsd/flex/dist/examples/manual/expr.y (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*357f1050SThomas Veerman /*
2*357f1050SThomas Veerman  * expr.y : A simple yacc expression parser
3*357f1050SThomas Veerman  *          Based on the Bison manual example.
4*357f1050SThomas Veerman  */
5*357f1050SThomas Veerman 
6*357f1050SThomas Veerman %{
7*357f1050SThomas Veerman #include <stdio.h>
8*357f1050SThomas Veerman #include <math.h>
9*357f1050SThomas Veerman 
10*357f1050SThomas Veerman %}
11*357f1050SThomas Veerman 
12*357f1050SThomas Veerman %union {
13*357f1050SThomas Veerman    float val;
14*357f1050SThomas Veerman }
15*357f1050SThomas Veerman 
16*357f1050SThomas Veerman %token NUMBER
17*357f1050SThomas Veerman %token PLUS MINUS MULT DIV EXPON
18*357f1050SThomas Veerman %token EOL
19*357f1050SThomas Veerman %token LB RB
20*357f1050SThomas Veerman 
21*357f1050SThomas Veerman %left  MINUS PLUS
22*357f1050SThomas Veerman %left  MULT DIV
23*357f1050SThomas Veerman %right EXPON
24*357f1050SThomas Veerman 
25*357f1050SThomas Veerman %type  <val> exp NUMBER
26*357f1050SThomas Veerman 
27*357f1050SThomas Veerman %%
28*357f1050SThomas Veerman input   :
29*357f1050SThomas Veerman         | input line
30*357f1050SThomas Veerman         ;
31*357f1050SThomas Veerman 
32*357f1050SThomas Veerman line    : EOL
33*357f1050SThomas Veerman         | exp EOL { printf("%g\n",$1);}
34*357f1050SThomas Veerman 
35*357f1050SThomas Veerman exp     : NUMBER                 { $$ = $1;        }
36*357f1050SThomas Veerman         | exp PLUS  exp          { $$ = $1 + $3;   }
37*357f1050SThomas Veerman         | exp MINUS exp          { $$ = $1 - $3;   }
38*357f1050SThomas Veerman         | exp MULT  exp          { $$ = $1 * $3;   }
39*357f1050SThomas Veerman         | exp DIV   exp          { $$ = $1 / $3;   }
40*357f1050SThomas Veerman         | MINUS  exp %prec MINUS { $$ = -$2;       }
41*357f1050SThomas Veerman         | exp EXPON exp          { $$ = pow($1,$3);}
42*357f1050SThomas Veerman         | LB exp RB                      { $$ = $2;        }
43*357f1050SThomas Veerman         ;
44*357f1050SThomas Veerman 
45*357f1050SThomas Veerman %%
46*357f1050SThomas Veerman 
47*357f1050SThomas Veerman yyerror(char *message)
48*357f1050SThomas Veerman {
49*357f1050SThomas Veerman   printf("%s\n",message);
50*357f1050SThomas Veerman }
51*357f1050SThomas Veerman 
main(int argc,char * argv[])52*357f1050SThomas Veerman int main(int argc, char *argv[])
53*357f1050SThomas Veerman {
54*357f1050SThomas Veerman   yyparse();
55*357f1050SThomas Veerman   return(0);
56*357f1050SThomas Veerman }
57*357f1050SThomas Veerman 
58*357f1050SThomas Veerman 
59*357f1050SThomas Veerman 
60*357f1050SThomas Veerman 
61*357f1050SThomas Veerman 
62*357f1050SThomas Veerman 
63*357f1050SThomas Veerman 
64*357f1050SThomas Veerman 
65