一个简单的计算器仅支持+ - * /和整数。我使用GNU / Linux。
hoc1.l:
%{
#include "y.tab.h"
extern int yylval;
%}
%%
[ \t] { ; }
[0-9]+ { sscanf(yytext, "%d", &yylval); printf("\nget %d\n", yylval); return NUMBER; }
\n {return 0;}
%%
int yywrap(void) {
return 1;
}
hoc1.y
%{
#include<stdio.h>
#define YYSTYPE int
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%%
list:
| list '\n'
| list expr '\n' {printf("\t%d\n",$2);}
;
expr: NUMBER { $$ = $1; }
| expr '+' expr {$$ = $1+$3;}
| expr '-' expr {$$ = $1-$3;}
| expr '*' expr {$$ = $1*$3;}
| expr '/' expr {$$ = $1/$3;}
;
%%
int main(void)
{
yyparse();
return 0;
}
int yyerror(char *s) {
fprintf(stderr, "*%s*\n", s);
return 0;
}
运行时间错误:
% ./hoc
8+9
get 8
+
get 9
*syntax error*
为什么以及如何解决它,thx!
答案 0 :(得分:3)
您忘记将您的运算符包含在您的lex文件中,并且您应该在成功读取令牌时返回非零值:直观地返回0表示yylex
没有匹配。删除处理换行符的lex文件中的行,并将其替换为以下内容:
[-+*/\n] { return *yytext; }
. { yyerror("unrecognized character"); return 0; }
现在它应该工作了。返回*yytext
允许您的yacc语法成功解析表达式,例如如果你得到'+',则返回它以允许语法正确解析。