我遵循野牛语法(作为更复杂的语法的一部分): ``
expression:
IDENTIFIER
| CONST
| LAMBDA match_block
;
match_block:
pattern '=' expression
| match_block '|' pattern '=' expression
;
pattern:
IDENTIFIER
| CONST
;
描述了包含带有模式匹配的标识符,常量和lambda函数的表达式,如下所示:lambda 0 = 1 | 1 = 2 | x = x
问题是1次移位/减少由嵌套匹配引起的歧义引起的冲突,如下例所示: lambda 0 = 1 | x = lambda 1 = 2 | y = 4
规则是匹配块与最近函数相关,如上例中的缩进所示 .
我的问题是 - 如何重写这个语法来消除这种歧义(不使用%left%right yacc指令)?
1 回答
如果你总是希望
|
绑定到最接近的LAMBDA
,那基本上只意味着你只能在match_block
的LAST|
子句中拥有LAMBDA
:基本上,您将
expression
和match_block
拆分为两个版本 - 一个允许lambda,另一个不允许 - 并在每个点使用适当的版本以避免歧义 .