parsing - Bison 转移减少冲突,我不知道在哪里

标签 parsing conflict bison reduce shift

语法:http://pastebin.com/ef2jt8Rg y.输出:http://pastebin.com/AEKXrrRG

我不知道这些冲突在哪里,有人可以帮助我解决这个问题吗?

最佳答案

y.output 文件准确地告诉您冲突的位置。第一个处于状态 4,因此如果您继续查看状态 4,您会看到:

state 4

   99 compound_statement: '{' . '}'
  100                   | '{' . statement_list '}'

    IDENTIFIER      shift, and go to state 6
          :
    IDENTIFIER  [reduce using rule 1 (threat_as_ref)]
    IDENTIFIER  [reduce using rule 2 (func_call_start)]

这告诉您在这种状态下(解析 compound_statement,看到 {),并查看下一个标记是 IDENTIFIER,它可以做 3 件可能的事情 - 移动 token (这将是 statement_list 的开头),减少 threat_as_ref 空生成,或减少 func_call_start 空生产。

方括号告诉您,它已决定永远不执行这些操作 - 默认的“首选转移而不是减少”冲突解决意味着它将始终执行转移。

语法的问题是这些空规则 threat_as_reffunc_call_start - 在移动 IDENTIFIER 之前需要减少它们,但为了知道它们是否是有效,解析器需要在标识符之后查看标记。仅当这是函数调用的开始时才应该减少 func_call_start (这取决于 IDENTIFIER 之后有一个 ()。因此解析器需要更多的前瞻来处理你的语法。在你的具体情况下,你的语法是 LALR(2) (2 个 token 前瞻就足够了),但不是 LALR(1),所以 bison 无法处理它。

现在您可以通过删除那些空规则来修复它 - func_call_start 根本没有任何操作,并且 threat_as_ref 的操作可以移至该操作中对于变量,但如果您将来想要这些规则,这可能是一个问题。

关于parsing - Bison 转移减少冲突,我不知道在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059116/

相关文章:

c++ - 用于将C++解析为AST的工具

c# - 这个 2 字节到 int 的转换有什么问题?

Git - 如何在所选文件上强制 merge 冲突和手动 merge

html - Foundation CSS 与菜单冲突

c - Flex 和 Bison 的词汇搭配

c - 语言解析器 Bison 中的语法错误

c# - 通过网络读取和解析大型文本文件的最佳方式是什么?

java - 用于解析未知长度消息的分隔符(最佳实践?)java

mootools - jQuery $(文档).ready();声明其中的所有函数

c++ - 来自字符串 vector 的 Bison 输入