改进ANTLR DSL解析错误消息

时间:2010-02-14 23:45:43

标签: error-handling antlr dsl

我正在为非程序员开发特定于域的语言(DSL)。非程序员犯了很多语法错误:他们拼写错误的关键字,不关闭括号,不终止块等等。

我正在使用ANTLR生成我的解析器;它为处理RecognitionExceptions提供了一个很好的机制来改进错误处理。但我发现很难为我的DSL开发好的错误处理代码。

此时,我正在考虑简化语言的方法,以便我更容易为用户提供高质量的错误消息,但我不确定如何解决这个问题。我想我想以某种方式减少错误的模糊性,但我不确定如何在语法中实现这个想法。

我可以通过哪些方式简化语言以改善用户的解析错误消息?

编辑:更新以澄清我对简化语言的方法感兴趣,而不仅仅是ANTLR错误处理提示。 (虽然,谢谢你们!)

4 个答案:

答案 0 :(得分:4)

我写了一篇关于在几年前恢复ANTLR错误中的行号和列号的文章,可能会有所帮助。

http://tech.puredanger.com/2007/02/01/recovering-line-and-column-numbers-in-your-antlr-ast/

答案 1 :(得分:1)

与手动语法相比,你可能在使用解析器生成器时遇到了最困难的部分。

根据我的经验,您要做的第一件事就是确保准确跟踪行和列信息,以便您可以将用户指向解析器认为错误所在的确切位置。

这应该为用户解决90%的问题,即在一行末尾缺少逗号或半冒号。

另外10%是问题所在。

我通常首先使用paraphrase关键字为我的词汇和语法标记提供有意义的名称。

SEMI
options {paraphrase="end of line terminator";}
: ';'
;

ifExpr
options {paraphrase="boolean expression";}
   : expr 
;

Antlr将在其生成的任何错误消息中使用这些短语。

请查看此页面:http://www.antlr2.org/doc/err.html,了解专家建议您如何使用Antlr 2进行操作,然后浏览此页面:http://www.antlr.org/blog/antlr3/error.handling.tml以查看Antlr 3所做的更改。 (Antlr2页面可能是最好的起点)。

答案 2 :(得分:0)

我最近读了一篇关于为解析器实现简单学习机制的人的文章。基本上,我们的想法是标记ANTLR为您提供的错误的实际原因的解析错误。例如,

  

错误:NilClass没有方法“bar”:foo

可以标记为:

  

错误:试图在foo上调用“bar”,但是foo没有值。

这个想法实际上来自2003年的一篇论文:Generating LR Syntax Error Messages from Examples。它也在research!rsc博客上讨论过。

答案 3 :(得分:0)

好的,到目前为止我从未使用过ANTLR,只有JavaCC。但是,既然您要实现DSL并关注可用性,那么您应该查看xtext

是一个框架
  • 允许您以EBNF表示法为DSL指定文本语法
  • 为您生成解析器
  • 生成一个编辑器,其语法突出显示和作为Eclipse插件的语法错误的即时反馈
  • 允许您访问底层AST,以将用户创建的文本表示转换为任何内容

我参加了去年itemis的演讲,这是一家专门研究DSL的德国公司。令人印象深刻的是这个东西设置和工作的容易程度。我用它来创建一个小游戏的编辑器,它使用游戏区域的文本描述,然后解析并转换为游戏的对象模型。