从 antlr 解析器中获取有意义的语法错误
Getting meaningful Syntax-errors from antlr parser
我已经使用 Antlr 为 .Net 创建了一个脚本解释器。它工作得很好,但它产生的语法错误很可怕。
可以找到处于早期开发阶段的库 here and the used grammar is based on this ecma-Script grammar。
现在最大的问题是,当我有一个很大的脚本文件并且我有一个对象定义说
obj = { var1 = "hello"
var2 = "world};
我预计会收到一条消息,提示“第 xyz 行出现语法错误”。
但取而代之的是,对于由于我缺少逗号引起的每个后续错误,在 xyz 获得了一百个没有可行替代方案的列表。
有没有办法解决由缺少逗号引起的错误?如果它会抱怨意外的 var2 令牌,那也完全没问题。
好吧,您可以使用 2 种方法:
- 您检查您是否识别出一个很可能会引起大量关注的错误 "errors" 并在之后禁止显示所有错误。因此,在出现更多错误之前,您必须先修复该错误。然而,这不会改变 ANTLR 生成的神秘消息...
- 您将一些常见的错误选项直接添加到您的语法中,并在它们被调用时通知错误侦听器。有了它,您可以自己指定错误消息。有关此主题的更多参考,您可以参考包含有关此内容的章节的
Definitive ANTLR 4 reference
,或者您可以查看使用此方法处理不平衡括号的 a grammar of mine。
当使用第二种方法时,您还应该去掉以下错误生成的内容 "errors",因为语法可以成功匹配给定的输入,因此可以正确继续。
因此,我强烈建议您使用第二种方法
我已经使用 Antlr 为 .Net 创建了一个脚本解释器。它工作得很好,但它产生的语法错误很可怕。 可以找到处于早期开发阶段的库 here and the used grammar is based on this ecma-Script grammar。
现在最大的问题是,当我有一个很大的脚本文件并且我有一个对象定义说
obj = { var1 = "hello"
var2 = "world};
我预计会收到一条消息,提示“第 xyz 行出现语法错误”。 但取而代之的是,对于由于我缺少逗号引起的每个后续错误,在 xyz 获得了一百个没有可行替代方案的列表。
有没有办法解决由缺少逗号引起的错误?如果它会抱怨意外的 var2 令牌,那也完全没问题。
好吧,您可以使用 2 种方法:
- 您检查您是否识别出一个很可能会引起大量关注的错误 "errors" 并在之后禁止显示所有错误。因此,在出现更多错误之前,您必须先修复该错误。然而,这不会改变 ANTLR 生成的神秘消息...
- 您将一些常见的错误选项直接添加到您的语法中,并在它们被调用时通知错误侦听器。有了它,您可以自己指定错误消息。有关此主题的更多参考,您可以参考包含有关此内容的章节的
Definitive ANTLR 4 reference
,或者您可以查看使用此方法处理不平衡括号的 a grammar of mine。
当使用第二种方法时,您还应该去掉以下错误生成的内容 "errors",因为语法可以成功匹配给定的输入,因此可以正确继续。
因此,我强烈建议您使用第二种方法