在Bison语法规则中,如果有两个规则都可以匹配输入的一部分,那么Bison会选择那个规则覆盖字符更少的规则。这是因为Bison在解析输入时采用的是一种称为“最大化匹配”的策略,即每次尽可能多地匹配输入。因此,如果Bison选择了覆盖字符较多的规则,可能会导致后续语法规则无法匹配输入,进而导致解析错误。
示例代码如下:
%{
#include
%}
%%
input: expr
| /* empty */
;
expr: NUMBER
| ADD expr expr
| SUB expr expr
;
NUMBER: [0-9]+
;
ADD: "+"
;
SUB: "-"
;
%%
int main(void) {
yyparse();
return 0;
}
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int yylex(void) {
int c = getchar();
if (c == EOF)
return 0;
if (c == '+' || c == '-')
return c;
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &yylval);
return NUMBER;
}
return c;
}
下一篇:Bison位移/归约冲突