【发布时间】:2022-01-22 07:46:50
【问题描述】:
我想为简单的计算器做解析器。
输入格式如“10+20;”、“50*60;”、“4+8;1-7;”
输出应该是 30 3000 12 -6
每个 case 结尾总是有一个分号";"
我的野牛文件是这样的
%{
#include <stdio.h>
extern FILE* yyin;
%}
%token T_NUM
%left '+' '-'
%left '*' '/'
%%
S : S E '\n' { printf("ans = %d\n", $2); }
| /* empty */ { /* empty */ }
;
E : E '+' E { $$ = $1 + $3; }
| E '-' E { $$ = $1 - $3; }
| E '*' E { $$ = $1 * $3; }
| E '/' E { $$ = $1 / $3; }
| T_NUM { $$ = $1; }
| '(' E ')' { $$ = $2; }
;
%%
yyerror (char *s)
{
fprintf(stderr, "%s\n", s);
}
yywrap()
{
return (1);
}
int main(int argc, char **argv)
{
yyin = fopen("testcase.in", "r");
yyparse();
fclose(yyin);
return 0;
}
Flex 文件如下所示:
%{
#include "cal.tab.h"
%}
%%
[0-9]+ { yylval = atoi(yytext); return T_NUM; }
[-/+*()\n] { return yytext[0]; }
[ \t] { }
[;] { }
. { return 0; /* end when meet everything else */ }
%%
testcase.in 看起来像这样
34+801;
1+2;
2+3;2+4;
3/2;3*5;
./a.out 应该是这样的
835
3
5
6
1
15
但我的结果是“语法错误”
希望你能帮助我.plz~
【问题讨论】:
标签: calculator bison