我有一个转变/减少冲突,我无法弄清楚它为什么会发生,以及如何解决它。
鉴于这个语法:
%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
所以我正在做某事< / em>错了。希望答案对其他人来说是显而易见的。
我最初认为这与Lambdas以()
开头而CallExpressions以此结束的事实有关,但将这些令牌更改为不冲突并没有区别。
/捂脸