2012-06-21 23 views
0

我正在使用ANTLR 3,我有一个问题是如何在输入中发生任何错误时如何找到下一个预期的标记。我试图覆盖解析器的getErrorMessage(RecognitionException e,String [] tokenNames),我可以得到错误,但我无法获得下一个预期的标记。如果有人可以帮忙。 在此先感谢。查找下一个预期的标记如果发生错误ANTLR 3

+0

这只对某些错误是可能的,并且取决于您的语法。 – 2012-06-21 17:28:25

回答

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 
    } 
} 
相关问题