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