2010-02-14 110 views
6

我工作的非程序员领域特定语言(DSL)。非程序员犯了很多语法错误:他们拼错了关键字,他们不关闭括号,他们不终止块等。提高ANTLR DSL解析错误消息

我正在使用ANTLR来生成我的解析器;它为处理RecognitionExceptions提供了一个漂亮的机制来改进错误处理。但是我发现为我的DSL开发出色的错误处理代码非常困难。

在这一点上,我正在考虑简化语言的方法,使我更容易为用户提供高质量的错误消息,但我不确定如何去解决这个问题。我觉得我要减少错误的模糊性莫名其妙,但我不知道如何实现在语法这一想法。

有什么办法,我可以简化我的语言,提高解析错误消息为我的用户?

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

+0

你能给我们提供一些关于语法的更多信息吗?你的DSL有什么好处,它有什么功能? – 2010-02-24 15:52:02

+0

http://www.choiceofgames.com/blog/choicescript-intro/我会马上指出,它不是没有上下文无关的... – 2010-02-25 00:49:53

+1

如果您的用户犯了常见错误,您可以拥有语法令牌规则匹配常见错误,然后使这些规则输出错误消息。 – 2010-02-25 11:18:44

回答

0

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

Error: No method "bar" for NilClass: foo

可以被标记为:

Error: Tried to call "bar" on foo, but foo didn't have a value.

的想法实际上是从2003年纸传来:Generating LR Syntax Error Messages from Examples。博客上的research!rsc也对此进行了讨论。

+0

是否有任何机会http://research.swtch.com/2010/01/generating-good-syntax-errors.html刚刚出现在reddit上? – 2010-03-17 11:51:54

+0

是的,谢谢!那真是让我烦恼。 – perimosocordiae 2010-03-17 15:48:08

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页面可能是最好的开始)。

0

好吧,我从来没有用过ANTLR到目前为止,只有JavaCC的。但既然你要实现一个DSL并关心可用性,你应该看看xtext。这是一个框架,

  • ,您可以指定文本语法在EBNF符号
  • 你的DSL生成一个解析器你
  • 生成语法高亮和语法错误的即时反馈作为Eclipse插件
  • 编辑
  • ,您可以访问底层的AST变换你的用户创建成什么

我通过参加演示文稿中的文字表述去年,一家专门研究DSL的德国公司去年。我很惊讶这个东西是多么容易设置和工作。我用它来创建一个小游戏的编辑器,它使用游戏场的文本描述,然后解析并转换成游戏的对象模型。