解决减少/减少冲突

时间:2016-03-21 21:40:09

标签: grammar bison yacc

如果我的语法中某个表达式可以匹配两个作品,我显然会减少/减少与yacc的冲突。具体来说,假设我有两个作品(FirstProduction和SecondProduction),其中两个作品都可能是TOKEN END

然后yacc将无法知道将TOKEN END减少到什么(FirstProduction或SecondProduction)。但是,我想让yacc在这种情况下优先FirstProduction。我怎样才能做到这一点?

请注意,FirstProductionSecondProduction都可能包含大量内容,Body是语法中唯一存在冲突的地方。

另外,我知道在这些情况下,yacc会选择在语法中声明的第一个作品。但是,我想避免任何减少/减少警告。

2 个答案:

答案 0 :(得分:1)

Bison没有办法明确标记一种产品优先于另一种产品;唯一的这种机制是优先关系,它解决了转移/减少冲突。如您所说,文件顺序提供隐式优先级。您可以使用%expect声明来取消警告;不幸的是,这只会让你告诉野牛有多少冲突可以预期,而不是哪些冲突。

答案 1 :(得分:1)

您可以重构语法,不允许第二个列表以可能属于第一个列表的内容开头:

Body: FirstProductionList SecondProductionList
    | FirstProductionList
    ;

FirstProductionList: FirstProductionList FirstProduction
                   | /* empty */
                   ;

SecondProductionList: SecondProductionList SecondProduction
                    | NonFirstProduction
                    ;

NonFirstProductionSecondProduction独有的任何作品,标志着从FirstProdution缩小到SecondProduction的过渡