gpt4 book ai didi

error-handling - Bison : one error causes additional but incorrect error

转载 作者:行者123 更新时间:2023-12-03 07:55:52 32 4
gpt4 key购买 nike

在我的代码的类部分,如果我写一个错误,则在不应该的情况下,将有几行报告为错误。我将'| error'放在可以从错误中恢复的良好/安全位置,但是我认为它没有使用它。也许它试图在某个地方恢复中间表情?

有什么方法可以迫使野牛尝试在指定的位置恢复?它是如何工作的,我可能做错了什么?

我将错误行放在循环旁边。这是一个例子:

SomeRuleLoop:
| Rule ',' SomeRuleLoop
Rule:
A
| B
| C
| Error
A:
AA AAB AABC
| AA AAB AABC Z
...

这是我的规则示例。我在控制台中看到“funcBody错误”,但是由于第一个错误,下一行出现了错误。即使每个funcBodyRule是独立的。
funcBodyLoop:
| funcBodyLoop funcBody

funcBody:
funcBodyRule
| error { printf("funcBody error"); $$=0; }
| '#' EQ { printf("still in funcBody\n"); $$=0; }

我尝试在第一个错误的行和第二个错误的行之间编写#==。我写这个来检查解析器是否仍然在funcbody循环中。这不会给出错误,而是。没关系,我添加了printf并且未打印字符串,所以也许它不再存在于函数循环中?我该如何解决?

最佳答案

Yacc和Bison通常使用左递归规则,显示的规则不是左递归。

如图所示,第一个规则等效于:

SomeRuleLoop:
/* Nothing */
| Rule ',' SomeRuleLoop
;

这是一条右递归规则,它说“SomeRuleLoop”是一个空的 token 字符串或“Rule”,后跟一个逗号和更多的“SomeRuleLoop”。请注意,这意味着“SomeRuleLoop”以逗号结尾,这可能与您的想法不符。

第一条规则应为:
SomeRuleLoop:
Rule
| SomeRuleLoop ',' Rule
;

请注意,允许使用空的替代品很重要-但将它们添加到各处往往会使语法变得模棱两可(更多的移位/减少冲突)

您还需要使用标记“错误”(所有小写)而不是“错误”(混合大小写)来指示可能发生错误恢复的点。

但是,我不确定您其余的麻烦是什么...

关于error-handling - Bison : one error causes additional but incorrect error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4230244/

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