/////////////
// Compile
/////////////
bison -d calc.y
flex calc.l
g++ calc.tab.c lex.yy.c -ll
/////////////
// calc.y
/////////////
%{
#include <stdio.h>
#include <stdlib.h>
int yylex();
void yyerror(const char *msg);
%}
%union {
float f;
}
%token <f> NUM
%type <f> E T F
%token EOL
%%
input:
/* epsilon */
| input S
S : E EOL { printf("%f\n", $1); }
| EOL { printf("Type an expression."); }
;
E : E '+' T { $$ = $1 + $3; }
| E '-' T { $$ = $1 - $3; }
| T { $$ = $1; }
;
T : T '*' F { $$ = $1 * $3; }
| T '/' F { $$ = $1 / $3; }
| F { $$ = $1; }
;
F : '(' E ')' { $$ = $2; }
| '-' F { $$ = -$2; }
| NUM { $$ = $1; }
;
%%
void yyerror(const char *msg){
fprintf(stderr, "Error: %s\n", msg);
}
int main(){
yyparse();
}
----------------------------------
////////////
// calc.l
////////////
%{
#include<stdio.h>
#include<stdlib.h>
#include "calc.tab.h" //Generated by Bison
%}
%%
[0-9.]+ { yylval.f = atof(yytext); return NUM; }
[-+()*/] { return yytext[0]; }
[ \t] ;
\n { return EOL; }
%%
int yywrap(void){
return 1;
}