[英]bison: one error causes additional but incorrect error
在我的代码的类部分中,如果我写了一个错误,则在不应该的情况下将报告几行错误。 我把' | error
| 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”是一个空的令牌字符串或“ Rule”,后跟一个逗号和更多的“ SomeRuleLoop”。 请注意,这意味着“ SomeRuleLoop”以逗号结尾,这可能与您的想法不符。
第一条规则应为:
SomeRuleLoop:
Rule
| SomeRuleLoop ',' Rule
;
请注意,允许使用空的替代品很重要-但是将其添加到各处往往会使语法变得模棱两可(更多的移位/减少冲突)
您还需要使用标记“错误”(所有小写)而不是“错误”(混合大小写)来指示可能发生错误恢复的点。
但是,我不确定您其余的麻烦是什么...
强制';' 或错误末尾的换行符可以解决该问题。 ( | error my_end_of_statenent
而不是| error
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.