如果我的语法中某个表达式可以匹配两个作品,我显然会减少/减少与yacc的冲突。具体来说,假设我有两个作品(FirstProduction和SecondProduction),其中两个作品都可能是TOKEN END
。
然后yacc将无法知道将TOKEN END
减少到什么(FirstProduction或SecondProduction)。但是,我想让yacc在这种情况下优先FirstProduction
。我怎样才能做到这一点?
请注意,FirstProduction
和SecondProduction
都可能包含大量内容,Body
是语法中唯一存在冲突的地方。
另外,我知道在这些情况下,yacc会选择在语法中声明的第一个作品。但是,我想避免任何减少/减少警告。
答案 0 :(得分:1)
Bison没有办法明确标记一种产品优先于另一种产品;唯一的这种机制是优先关系,它解决了转移/减少冲突。如您所说,文件顺序提供隐式优先级。您可以使用%expect
声明来取消警告;不幸的是,这只会让你告诉野牛有多少冲突可以预期,而不是哪些冲突。
答案 1 :(得分:1)
您可以重构语法,不允许第二个列表以可能属于第一个列表的内容开头:
Body: FirstProductionList SecondProductionList
| FirstProductionList
;
FirstProductionList: FirstProductionList FirstProduction
| /* empty */
;
SecondProductionList: SecondProductionList SecondProduction
| NonFirstProduction
;
NonFirstProduction
是SecondProduction
独有的任何作品,标志着从FirstProdution
缩小到SecondProduction
的过渡