这个错误通常意味着在Bison语法文件中有一个语法规则或其它描述错误。通常解决方法是检查Bison语法文件中的每个规则,并确保它们都正确描述了语法。
下面是一个包含错误的示例Bison语法文件(错误码为“unexpected $end”):
%{
#include
%}
%token PLUS MINUS TIMES DIVIDE LPAREN RPAREN NUMBER
%%
expression: expression PLUS expression
| expression MINUS expression
| expression TIMES expression
| expression DIVIDE expression
| LPAREN expression RPAREN
| NUMBER
%%
int main() {
yyparse();
return 0;
}
int yyerror(char *s) {
printf("Error: %s\n", s);
}
为了解决这个错误,我们需要在最后一个规则(expression
)后添加一个结束符:
%{
#include
%}
%token PLUS MINUS TIMES DIVIDE LPAREN RPAREN NUMBER
%%
expression: expression PLUS expression
| expression MINUS expression
| expression TIMES expression
| expression DIVIDE expression
| LPAREN expression RPAREN
| NUMBER
| /* Add empty rule to indicate end of file */
%%
int main() {
yyparse();
return 0;
}
int yyerror(char *s) {
printf("Error: %s\n", s);
}
添加空规则后,Bison 将不会被视为意外和未定义的 token, 并可正确处理。