2012-02-22 79 views
2

我在使用ANTLR v3恢复和重新发布错误时遇到问题。我遵循这个链接http://www.antlr.org/blog/antlr3/error.handling.tml,但我没有解决方案。 我想让例如一些报告和恢复 在这样的源程序: 学生输入代码:ANTLR:错误恢复和报告

FOR(int a=0;a<10;a++){ 
b=b*a; 
} 

,并计划将报告是这样的: 计划:“是你的意思是关键字,用于为对于?” 学生回答:“是” 之后,系统自动恢复并修改源代码。 ANTLR v3如何做到这一点?不可能与ANTLR做什么? 需要帮助。多谢你们!

+0

重新开始解析从头开始是否可以接受?它可能会简化实施。 – sarnold 2012-02-22 04:07:47

+0

是的..你有解决方案吗? – 2012-02-22 06:43:58

回答

1

我认为你需要在生成的解析器类中覆盖org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken

ANTLR检测到无效标记时调用此函数。因此,在您自己的功能中,您可以询问用户是否需要恢复。

如果需要,则可以拨打BaseRecognizer.recoverFromMismatchedToken执行恢复。如果没有,你可以抛出异常MismatchedTokenException

+0

你能给我这个例子的链接吗?我只是混淆。但是谢谢lex li – 2012-02-22 06:43:22

+0

我不能给你一个Java的例子,因为我在C#中使用ANTLR。 https://github.com/lextm/sharpsnmplib/blob/2f9e8d2d48547b37e7cb6d75cdcb0ffae29f82e3/SharpSnmpLib/Mib/SmiParser.cs这是C#中定义的部分类,它将最终与Smi.g语法中的ANTLR生成的SmiParser.cs文件合并文件。 SmiParser类是从ANTLR的BaseRecognizer派生而来的。在这里,我覆盖了RecoverFromMismatchedToken函数,只是简单地抛出一个异常。在Java中,您应该使用类似的方法来覆盖函数,然后实现自己的逻辑。 – 2012-02-22 09:12:30

+0

感谢lex li为此解决方案。对于你的情况,这是不可能的使用ANTLR的概念像这样http://stackoverflow.com/questions/9262195/parsing-java-code-with-antlr-need-concept – 2012-02-22 14:31:28