语法: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_ref
和 func_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/