野牛抱怨“冲突:1班/减少”。我看不出有什么不对。请帮忙。谢谢,
%token OR AND NUMBER
%%
search_condition:
| search_condition AND search_condition { printf(" AND "); }
| '(' search_condition ')'
| predicate
;
predicate:
NUMBER { printf("%d\n", $1); }
;
答案 0 :(得分:9)
冲突意味着你给bison的语法不是LALR(1),所以它无法决定在每种可能的情况下采取什么行动才能正确解析语法。
在你的情况下,问题是你的语法含糊不清。如果你给它一个像
这样的输入NUMBER AND NUMBER AND NUMBER
它无法决定是否应将其解析为等同于
( NUMBER AND NUMBER ) AND NUMBER
或
NUMBER AND ( NUMBER AND NUMBER )
您可以通过多种方式解决此问题:
您可以使用%left AND
或%right AND
告诉Bison它应该将AND
视为左关联或右关联中缀运算符
您可以重构search_condition
规则,使其明确无误:
search_condition : search_condition AND primary
| primary
;
primary : '( search_condition ')'
| predicate
;