Lemon以与 Bison 相似但不完全相同的方式实现优先规则,并且该功能可用于解决您遇到的“悬空其他”移位/减少冲突,因为它通常应用于野牛。
Lemon 和 Bison 优先级声明之间有两个主要区别:
Bison 提供了和%precedence
的替代%left
方案。但是,通常可以在更合适的任何地方使用。%right
%nonassoc
%nonassoc
%precedence
在 Bison 中,您可以使用%prec TERMINAL
. 在 Lemon 中,您可以通过在生产后放置来做同样的事情[TERMINAL]
。(这在上面链接的手册的优先规则部分中进行了解释。)
此外,Bison 允许您对终端使用双引号字符串,这是 Lemon 中不可用的功能。
综上所述,您可以将Bison 解决方案应用于 Lemon,如下所示:
/* LEMON (non-terminals abbreviated) */ /* Bison (from linked answer) */
%nonassoc KWD_IF %nonassoc "then"
%nonassoc KWD_ELSE %nonassoc "else"
%% %%
sel: KWD_IF LPAREN exp RPAREN stm. [KWD_ELSE] stm: "if" "(" exp ")" stm %prec "then"
| KWD_IF LPAREN exp RPAREN stm KWD_ELSE stm. | "if" "(" exp ")" stm "else" stm
也可以使语法明确,但工作量更大。在链接的维基百科条目中,有一个如何做到这一点的例子。