【问题标题】:How this YACC code makes a shift/reduce conflict?(very simple)这个 YACC 代码是如何产生 shift/reduce 冲突的?(很简单)
【发布时间】:2019-05-07 11:19:08
【问题描述】:

我真的很想理解为什么这会产生冲突,但我认为我错过了一些东西。

%token D
%start a

%%

a
    : b
    | a '+' b
    ;

b
    : c
    | c '+' '+'
    ;

c
    : D
    ;

我发现相同的 '+' 字符造成了问题,但我在这段代码中找不到任何歧义...

我真的提前感谢

【问题讨论】:

  • 您应该将++ 视为词法分析器中的单个标记。
  • @user207421 非常感谢,但我能知道原因吗?还是没有理由这样做?

标签: yacc


【解决方案1】:

让我们如下标记您的替代方案:

a
    : b          // a1
    | a '+' b    // a2
    ;

b
    : c          // b1
    | c '+' '+'  // b2
    ;

现在如果解析器刚刚解析了c,而下一个标记是'+',则有两种可能性:+ 可能是c '+' '+' 的一部分,在这种情况下应该选择b2 ,或者+ 可能是a '+' b 的一部分,在这种情况下,应该选择b1,然后选择a2。但是,如果没有看到第二个 +,解析器就无法知道是哪种情况,而 YACC 作为 LALR(1) 解析器生成器,只能向前看一个令牌,而不是两个。

所以这就是你发生冲突的原因。正如已经指出的那样,解决方案是使++ 成为单个令牌。这还有一个好处是++ 中不再允许使用空格,这更接近于现有语言的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多