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 Veermanint 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