flex和bison计算器2
这个代码是我根据上一篇做了改进的代码,可以进行小数的运算;
可以计算小数的计算器
改进的代码
//修改flex.l中识别数字的部分,将正则表达式替换,并且使用stof转换字符串
[0-9]+(.[0-9]+)? { yylval = atof(yytext); return id; }
//修改字符的属性类型
//set attribute type
%define api.value.type {double}
//修改bison.y遇到结束的输出
start:
| start E EOL { printf("= %g\n> ", $2); };
代码使用到的文法:
S->E
E->E+T | E-T | T
T->T*F | T/F | F
F->(E) | id
Ubuntu 编译指令
flex test.l
bison -d test.y
gcc -o test lex.yy.c test.tab.c -lfl
flex.l文件
%{
# include "test.tab.h"
int lexerror(char *s);
%}
%%
"+" { return '+'; }
"-" { return '-'; }
"*" { return '*'; }
"/" { return '/'; }
"(" { return '('; }
")" { return ')'; }
[0-9]+(.[0-9]+)? { yylval = atof(yytext); return id; }
\n { return EOL; }
[ \t] { /* ignore white space */ }
. { lexerror(yytext); }
%%
int lexerror(char *s)
{
fprintf(stderr, "lexical error: %s\n", s);
}
bison.y文件
%{
# include <stdio.h>
int yyerror(char *s);
int yylex();
%}
//set attribute type
%define api.value.type {double}
/* declare tokens (terminal symbols) */
%token id 256
%token EOL 263
%%
start:
| start E EOL { printf("= %g\n> ", $2); };
E: T
| E '+' T { $$ = $1 + $3; }
| E '-' T { $$ = $1 - $3; }
;
T: F { $$ = $1; }
| T '*' F { $$ = $1 * $3; }
| T '/' F { $$ = $1 / $3; }
;
F: id { $$ = $1; }
| '(' E ')' { $$ = $2; }
;
%%
int main()
{
printf("> ");
yyparse();
}
int yyerror(char *s)
{
fprintf(stderr, "error: %s\n", s);
}