野牛转移/减少简单呼叫表达/ lambda语法中的冲突

时间:2016-11-14 01:00:56

标签: parsing grammar bison jison shift-reduce-conflict

我有一个转变/减少冲突,我无法弄清楚它为什么会发生,以及如何解决它。

鉴于这个语法:

%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以此结束的事实有关,但将这些令牌更改为不冲突并没有区别。

/捂脸

0 个答案:

没有答案