66 lines
1 KiB
Text
66 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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|