这个问题通常是由于在Bison语法文件中定义了非终结符,但在规则中没有使用它们所导致的。一种解决方法是通过将不需要的非终结符从语法文件和规则中删除来解决。例如,下面的示例代码中可以看到名为'useless_nonterminal”的非终结符在规则中没有被使用:
%{
/* C code */
%}
%token useful_terminal
%token useless_terminal
%%
useful_nonterminal : useful_terminal useless_terminal
| useful_terminal
;
useless_nonterminal : /* empty */
;
%%
int main() {
/* C code */
return yyparse();
}
int yyerror(const char* error_message) {
/* C code */
return 0;
}
为了解决这个问题,可以直接删除不需要的'useless_nonterminal”非终结符及其所有相关规则,例如:
%{
/* C code */
%}
%token useful_terminal
%token useless_terminal
%%
useful_nonterminal : useful_terminal useless_terminal
| useful_terminal
;
%%
int main() {
/* C code */
return yyparse();
}
int yyerror(const char* error_message) {
/* C code */
return 0;
}
这种方法可以消除Bison非终结符在语法中无用,规则在解析器中无用的问题。