语法: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 种可能的事情——移动标记(这将是 statement_list 的开始) ),减少threat_as_ref空产生,或者减少func_call_start空产生。

括号告诉您它已决定永远不执行这些操作——默认的“优先转换而不是减少”冲突解决方案意味着它将始终执行转换。

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

现在你可以通过去掉那些空规则来修复它——func_call_start 根本没有 Action ,threat_as_ref 的 Action 可以移到 variable 的 Action 中,但如果你以后想要这些规则,那可能是一个问题.

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

10-13 07:35