我正在使用ANTLR 3,我有一个问题是如何在输入中发生任何错误时如何找到下一个预期的标记。我试图覆盖解析器的getErrorMessage(RecognitionException e,String [] tokenNames),我可以得到错误,但我无法获得下一个预期的标记。如果有人可以帮忙。 在此先感谢。查找下一个预期的标记如果发生错误ANTLR 3
0
A
回答
1
这并不像听起来那么容易。很多时候,这些信息是不可用的。
例如,您的语法可以匹配括号内的表达式,如下所示:(1+2)
。
如果您的解析器现在试图解析"(1+2"
,一个MismatchedTokenException
会被抛出,其expecting
属性将是')'
类型。所以,这很简单。
然而,当它试图解析"1+2)"
,一个MismatchedTokenException
将再次被抛出,但现在解析器会抱怨说,它预计EOF
,因为它希望只是解析像1+2
的表达式。它会不是告诉你,在“过去”的某个地方,你忘了'('
。
因此,只会有几次让您从解析器引发的异常中提取预期的标记。在大多数情况下,您需要做(很多艰苦的工作)来自己提取这些信息。在解析器中创建有意义的错误消息不是一项简单的任务! (至少,不会比简单地写了一个不太复杂的语言语法)在
我建议要通过ANTLR's API docs,看看哪些异常被ANTLR抛出和目的饲料解析器无效输入,和压倒一切的reportError(...)
您解析器来查看抛出哪个异常:
@parser::members {
@Override
public void reportError(RecognitionException e) {
// inspect 'e' and handle/report it
}
}
相关问题
- 1. Antlr空格标记错误
- 2. 查找标记错误(分组标记)
- 3. 错误:预期“:”之前“)”标记
- 4. 预期';'之前“(”标记错误
- 5. Zend_Soap - 错误解析WSDL:开始标记预期,“<”未找到
- 6. 查询发生错误ora-00923关键字找不到预期的地方
- 7. 预期值,错误结果
- 8. Swift 3:如果日期发生变化,找出答案 - 如何?
- 9. 查找ASP.NET标记错误的工具?
- 10. 预期表达否则,如果错误
- 11. 在Oracle 10g中查找错误的日期时间标记
- 12. 语法错误:预期操作数(错误标记为“‘)
- 13. 查找下一个星期一的Java日期6:00,例如
- 14. onclick标记h中发生错误:commandLink
- 15. 脚本中发生错误。第1行错误预期')' - ASP.Net
- 16. 预期标识符错误?
- 17. 如果发生错误,跳到阵列中的下一个主机
- 18. 错误:'#'标记之前的预期标识符
- 19. 查询不产生预期的结果
- 20. Rails标记:按发生次数查找标记
- 21. 解压缩数据时发生错误-3:错误的标题检查
- 22. 预期标识符错误或“(”错误
- 23. 为什么我得到一个标识符预期的错误
- 24. PostgresSQL检查日期和发生错误
- 25. 错误:在'='标记之前的预期表达式
- 26. 当我定义指针的一类错误:预期构造,析构函数,或类型之前“*”标记发生
- 27. 在Kohana 3中,你如何计算查询期间发生的错误?
- 28. 错误与预期的标识符或'('
- 29. 查找MATCH的下一个结果
- 30. 错误:预期“;”
这只对某些错误是可能的,并且取决于您的语法。 – 2012-06-21 17:28:25