【问题标题】:I was programming in YACC, when for a grammar I got a shift reduce conflict. Do I have to worry about this?我在 YACC 编程时,我遇到了一个减少冲突的语法。我需要担心这个吗?
【发布时间】:2025-12-06 23:35:01
【问题描述】:

据我对 SLR 解析器本身的理解,它通过使用句柄和可行的前缀等解决了 shift reduce 冲突。那么 shift reduce 冲突为什么要困扰我呢?

【问题讨论】:

    标签: compiler-construction yacc lex


    【解决方案1】:

    冲突意味着生成的解析器可能不接受语法描述的整个语言,而是接受该语言的子集。如果你不关心不解析一些根据语法合法的构造,那么你可以忽略 shift/reduce 和 reduce/reduce 冲突。

    现在有时冲突是由于语法中的歧义,这意味着解析同一事物有多种方法,有时在这种情况下,可以忽略冲突,因为解析器仍然会解析整个语言。但并非总是如此(实际上它是例外而不是规则),因此通常您需要查看为什么语法有冲突以及对解析器有什么影响。

    【讨论】:

      【解决方案2】:

      你不必担心一个,如果是else/if冲突。您当然应该担心的其他任何事情,并且确实很难调试。幸运的是,您正在做简单的语法,并且有足够多的简单示例,您只需要比较和对比。

      【讨论】:

        最近更新 更多