我有以下野牛语法(作为更复杂语法的一部分):
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 指令)?