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

时间:2014-02-16 03:34:34

标签: parsing parser-generator lalr

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

我正在使用紫龙书来帮助我完成设计,我从中收集到的是解析器中有四种错误恢复方法:

  • 恐慌模式:开始转储输入符号,直到找到编译器设计者预先选择的符号
  • 词组级别恢复:将输入字符串修改为允许当前生产减少的内容
  • 错误产生:通过将错误纳入语法来预测错误
  • 全局更正:更复杂的短语级别恢复版本(据我所知)

其中两个需要修改输入字符串(我想避免),另外两个要求编译器设计人员根据他们对语言的了解来预测错误并设计错误恢复。但解析器生成器也有关于语言的知识,所以我很好奇是否有更好的方法可以从解析错误中恢复,而无需预先选择同步令牌或用错误产生填充语法。

而不是选择同步令牌,解析器不能仅仅处理当前生产可以减少为同步令牌的所有非终结符号中的符号吗?我还没有弄清楚它的工作效果如何 - 我将解析器可视化为正在进行中的一系列制作,但当然这不是自下而上的解析器的工作方式。试图找到可行状态会产生太多不相关的错误吗?它会尝试以无效状态恢复解析器吗?有没有一种方法可以使用有效的错误操作预先填充解析器表,这样实际的解析程序就不必在遇到错误时推断下一步该去哪了?

1 个答案:

答案 0 :(得分:4)

当你试图盲目跟随所有可用的作品时,太容易迷失在死胡同里。你知道关于你的语言的东西,解析器生成器很难弄明白。 (例如,跳过下一个语句分隔符很可能允许解析恢复。)

这并不是说没有尝试过自动程序。在解析理论(Sippu& Soisalon-Soininen)中有一个很长的部分。 (不幸的是,this article是有效的,但如果你有一个ACM会员资格或访问一个好的图书馆,你可以找到它。)

总的来说,yacc策略已被证明“不可怕”,甚至“足够好”。有一种众所周知的方法可以使它变得更好,即收集非常糟糕的语法错误消息(或失败的错误恢复),将它们追踪到发生时处于活动状态(这很容易),并附加一个错误恢复过程到该精确状态和前瞻标记。例如,请参阅Russ Cox's approach