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*3c3a7b76Schristosint 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