gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:01:29 28 4
gpt4 key购买 nike

语法:http://pastebin.com/ef2jt8Rgy.输出: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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com