67 lines
1 KiB
Text
67 lines
1 KiB
Text
|
/* $NetBSD: expr.y,v 1.1.1.1 2009/10/26 00:28:33 christos Exp $ */
|
||
|
|
||
|
/*
|
||
|
* expr.y : A simple yacc expression parser
|
||
|
* Based on the Bison manual example.
|
||
|
*/
|
||
|
|
||
|
%{
|
||
|
#include <stdio.h>
|
||
|
#include <math.h>
|
||
|
|
||
|
%}
|
||
|
|
||
|
%union {
|
||
|
float val;
|
||
|
}
|
||
|
|
||
|
%token NUMBER
|
||
|
%token PLUS MINUS MULT DIV EXPON
|
||
|
%token EOL
|
||
|
%token LB RB
|
||
|
|
||
|
%left MINUS PLUS
|
||
|
%left MULT DIV
|
||
|
%right EXPON
|
||
|
|
||
|
%type <val> exp NUMBER
|
||
|
|
||
|
%%
|
||
|
input :
|
||
|
| input line
|
||
|
;
|
||
|
|
||
|
line : EOL
|
||
|
| exp EOL { printf("%g\n",$1);}
|
||
|
|
||
|
exp : NUMBER { $$ = $1; }
|
||
|
| exp PLUS exp { $$ = $1 + $3; }
|
||
|
| exp MINUS exp { $$ = $1 - $3; }
|
||
|
| exp MULT exp { $$ = $1 * $3; }
|
||
|
| exp DIV exp { $$ = $1 / $3; }
|
||
|
| MINUS exp %prec MINUS { $$ = -$2; }
|
||
|
| exp EXPON exp { $$ = pow($1,$3);}
|
||
|
| LB exp RB { $$ = $2; }
|
||
|
;
|
||
|
|
||
|
%%
|
||
|
|
||
|
yyerror(char *message)
|
||
|
{
|
||
|
printf("%s\n",message);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
yyparse();
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|