0

なぜそれが起こっているのか、そしてそれを解決する方法がわからないというシフト/リデュースの競合があります。

この文法を考えると:

%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 で終わるという事実に関連していると思っていました()が、これらのトークンを競合しないように変更しても違いはありません。

/フェイスパーム

4

0 に答える 0