%{
#include "y.tab.h"
extern vbltable[26];
%}
%option noyywrap
%%
[1-9][0-9]*|0|([0-9]+\.[0-9]+) {yylval.dval = atof(yytext); return NUMBER;}
[ \t] ;
[a-z]+ {yylval.vblno = yytext[0] - 'a'; return NAME;}
\n return 0;
. return yytext[0];
%%
%{
#include <stdio.h>
#include <stdlib.h>
double vbltable[26];
%}
%union{
double dval;
int vblno;
}
%token <vblno> NAME
%token <dval> NUMBER
%type <dval> expression
%left '-' '+'
%left '*' '/'
%nonassoc UMIUS
%%
statement: NAME '=' expression {vbltable[$1] = $3;}
| expression {printf(">>%f\n",$1);}
;
expression :
expression '+' expression {$$ = $1 + $3;}
| expression '-' expression {$$ = $1 - $3;}
| expression '*' expression {$$ = $1 * $3;}
| expression '/' expression {
if ($3 == 0)
{
yyerror("diveded by zero");
}
else
$$ = $1 / $3;
}
| '('expression')' {$$ = $2;}
| NUMBER
| NAME {$$ = vbltable[$1];}
;
%%
int
yyerror (char const *str)
{
extern char *yytext;
fprintf(stderr,"parser error near str: %s; yytext: %s\n",str,yytext);
return 0;
}
void main()
{
extern int yyparse(void);
extern FILE *yyin;
yyin = stdin;
while(1){
if (yyparse()){
exit(1);
}
}
}