当在 bison 解析语法时遇到使用了错误的规则时,需要检查代码并进行修改。下面是一个示例:
假设我们有一个包含两个终结符(ID和LPAREN)和一个非终结符(expr)的语言,其中非终结符 expr 可以由一个 ID 或者一个 LPAREN 后跟一个 expr 生成。下面是一种可能的 bison 语法:
%{
#include
%}
%token ID LPAREN
%%
expr: ID
| LPAREN expr
;
%%
int main()
{
yyparse();
return 0;
}
void yyerror(char *s)
{
printf("%s", s);
}
在上面的语法中,我们想要表达的意思是,expr 可以由 ID 或者 LPAREN 后跟 expr 生成。但是由于代码错误,我们写成了 LPAREN expr,这会导致编译错误。
为了解决这个问题,我们需要修改 expr 的规则,将 LPAREN 放在 | 的前面,如下所示:
%{
#include
%}
%token ID LPAREN
%%
expr: ID
| expr LPAREN
;
%%
int main()
{
yyparse();
return 0;
}
void yyerror(char *s)
{
printf("%s", s);
}
在新的规则中,我们正确表示了 expr 可以由 ID 或者 expr 后跟 LPAREN 生成的意思。这样就能够完美解决“Wrong rule used in bison”的问题了。
上一篇:Bison中具有多种类型的令牌