Parsing 语法是否可以自动指导解析器错误恢复?

Parsing 语法是否可以自动指导解析器错误恢复?,parsing,parser-generator,lalr,Parsing,Parser Generator,Lalr,我正在编写一个LALR解析器生成器作为一个宠物项目 我正在使用紫龙书来帮助我进行设计,我从中得到的信息是,解析器中有四种错误恢复方法: 紧急模式:开始转储输入符号,直到找到编译器设计器预先选择的符号为止 短语级恢复:将输入字符串修改为允许当前生产减少的内容 错误产生:通过将错误合并到语法中来预测错误 全局更正:短语级恢复的更复杂版本(据我所知) 其中两个需要修改输入字符串(我希望避免),另外两个需要编译器设计器根据他们对语言的知识预测错误并设计错误恢复。但是解析器生成器也了解该语言,所以我很

我正在编写一个LALR解析器生成器作为一个宠物项目

我正在使用紫龙书来帮助我进行设计,我从中得到的信息是,解析器中有四种错误恢复方法:

  • 紧急模式:开始转储输入符号,直到找到编译器设计器预先选择的符号为止
  • 短语级恢复:将输入字符串修改为允许当前生产减少的内容
  • 错误产生:通过将错误合并到语法中来预测错误
  • 全局更正:短语级恢复的更复杂版本(据我所知)
其中两个需要修改输入字符串(我希望避免),另外两个需要编译器设计器根据他们对语言的知识预测错误并设计错误恢复。但是解析器生成器也了解该语言,所以我很好奇是否有更好的方法可以从解析错误中恢复,而无需预先选择同步标记或用错误生成填充语法


解析器不能将当前产品可以简化为的所有非终端中的符号作为同步令牌,而不是选择同步令牌吗?我还没有真正弄清楚这会有多好——我将解析器想象成一系列正在进行的产品,但当然,自下而上的解析器不是这样工作的。为了找到一个可行的状态,它会产生太多不相关的错误吗?它会尝试在无效状态下恢复解析器吗?有没有一种好方法可以用有效的错误操作预先填充解析器表,这样实际的解析程序就不必在遇到错误时推理下一步要去哪里?

当您试图盲目地跟踪所有可用的产品时,很容易陷入死胡同。对于您的语言,您所知道的一些事情对于解析器生成器来说是很难理解的。(例如,跳转到下一个语句分隔符很可能允许恢复解析。)

这并不是说自动化程序还没有尝试过。在句法分析理论中有一个很长的章节(Sippu&Soisalon-Soininen)。(不幸的是,它是收费的,但如果您拥有ACM会员资格或访问一个好的库,您可能会找到它。)


总体而言,yacc战略已被证明“并不可怕”,甚至“足够好”。有一种众所周知的改进方法,即收集非常糟糕的语法错误消息(或错误恢复失败),跟踪它们到发生时处于活动状态(这很容易做到),并将错误恢复过程附加到该精确状态和前瞻令牌。例如,请看。

我再也不能访问图书馆了,但我可能会买这篇文章,只要15美元。同时,你认为多种方法的结合能奏效吗?就像在当前产品的后续部分开始搜索符号,然后尝试减少?如果存在减少冲突,则返回到错误生产或恐慌模式?我只是觉得如果某个列表中某个函数参数的lambda中出现错误,而它只是跳出并跳过所有这些内容,直到下一个右括号或其他东西,那将是一种可怕的浪费。@CarsonMyers:浪费什么?如果程序中存在语法错误,您所能做的就是显示一条错误消息(可能还有关于如何修复错误的建议)。理想情况下,您还可以继续捕获其他语法错误,这是错误恢复的关键,但生成无意义的错误消息也很糟糕,因此您不应该总是试图捕获所有可能的错误。最重要的是生成有意义的错误消息(以及实际有用的建议)。老实说,我认为工具辅助定制方法是最好的。是的,我想你是对的。报告错误是很重要的,但如果需要几个编译周期才能得到所有错误,这并不是一个很大的挫折。我可能还是会读报纸,玩弄它,但我不会挂断它