Bison “野牛抱怨”;冲突:1移位/减少“;
野牛抱怨“冲突:1班/减少”。我看不出有什么问题。请帮忙。谢谢Bison “野牛抱怨”;冲突:1移位/减少“;,bison,yacc,Bison,Yacc,野牛抱怨“冲突:1班/减少”。我看不出有什么问题。请帮忙。谢谢 %token OR AND NUMBER %% search_condition: | search_condition AND search_condition { printf(" AND "); } | '(' search_condition ')' | predicate ; predicate:
%token OR AND NUMBER
%%
search_condition:
| search_condition AND search_condition { printf(" AND "); }
| '(' search_condition ')'
| predicate
;
predicate:
NUMBER { printf("%d\n", $1); }
;
冲突意味着您提供给bison的语法不是LALR(1),因此它无法决定在每种可能的情况下采取什么操作来正确解析语法 就你而言,问题在于你的语法模棱两可。如果你给它一个输入,比如
NUMBER AND NUMBER AND NUMBER
它无法决定是否应该将其解析为与
( NUMBER AND NUMBER ) AND NUMBER
或
有多种方法可以解决此问题:
- 您可以使用
或%left和
告诉bison它应该将%right和
视为左或右关联中缀运算符和
- 您可以重构
规则以使其明确:search\u条件
search_condition : search_condition AND primary | primary ; primary : '( search_condition ')' | predicate ;
搜索条件
与空字符串(epsilon)匹配:搜索条件:/*epsilon*/|搜索条件和…
,是否删除第一个管道<代码>搜索条件:搜索条件和…?添加剩余%并解决问题。谢谢
search_condition : search_condition AND primary
| primary
;
primary : '( search_condition ')'
| predicate
;