我有一个转变/减少冲突,我无法弄清楚它为什么会发生,以及如何解决它。
鉴于此语法:
%token IDENTIFIER
%start Expression
%%
CallExpression
: Expression "(" ")"
;
Lambda
: "(" ")" "=>" Expression
;
Expression
: IDENTIFIER
| CallExpression
| Lambda
;
我希望能够解析这样的表达式(不详尽):
foo
foo()
() => foo
() => () => foo
() => foo()
但是我在这里收到了移位/减少冲突:
State 11
1 CallExpression: Expression . "(" ")"
2 Lambda: "(" ")" "=>" Expression . [$end, "("]
"(" shift, and go to state 8
"(" [reduce using rule 2 (Lambda)]
$default reduce using rule 2 (Lambda)
我以为我明白何时发生班次/减少,但这个人正在逃避我,所以我需要接受教育。
我尝试更多地了解可用的优先级指令,left, right, precedence, nonassoc
但是我尝试使用它们并不能解决歧义,而且它们也给了我warning: useless precedence and associativity
,所以我做错了。希望答案对其他人来说是显而易见的。
我最初认为这与 Lambdas 以它开头()
和 CallExpressions 以它结尾的事实有关,但是将这些标记更改为不冲突没有任何区别。
/掌脸