なぜそれが起こっているのか、そしてそれを解決する方法がわからないというシフト/リデュースの競合があります。
この文法を考えると:
%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
ことをしている. 答えが他の人にとって明らかであることを願っています。
最初はこれが Lambda で始まり CallExpressions で終わるという事実に関連していると思っていました()
が、これらのトークンを競合しないように変更しても違いはありません。
/フェイスパーム