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