我正在为非程序员开发特定于域的语言(DSL)。非程序员犯了很多语法错误:他们拼写错误的关键字,不关闭括号,不终止块等等。
我正在使用ANTLR生成我的解析器;它为处理RecognitionExceptions提供了一个很好的机制来改进错误处理。但我发现很难为我的DSL开发好的错误处理代码。
此时,我正在考虑简化语言的方法,以便我更容易为用户提供高质量的错误消息,但我不确定如何解决这个问题。我想我想以某种方式减少错误的模糊性,但我不确定如何在语法中实现这个想法。
我可以通过哪些方式简化语言以改善用户的解析错误消息?
编辑:更新以澄清我对简化语言的方法感兴趣,而不仅仅是ANTLR错误处理提示。 (虽然,谢谢你们!)
答案 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)