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,所以我做错了。希望答案对其他人来说是显而易见的。

我最初认为这与 Lambdas 以它开头()和 CallExpressions 以它结尾的事实有关,但是将这些标记更改为不冲突没有任何区别。

/掌脸

4

0 回答 0