/////////////
// 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;
}