使用antlr3获取用户定义的错误消息

时间:2009-10-16 10:15:40

标签: antlr messages

numberrange returns [String value]
    :   numberrangesub
        {
        String numberRange = ($numberrangesub.text);
        String [] v = numberRange.split(",");
        if ( Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim())) $value =numberRange;
        else throw new RecognitionException();
        }
    ;

请注意上面的ANTLR代码。在这里,我想抛出一个用户友好的错误消息,如"from value should be less than to value in BETWEEN clause"。 我期待这样RecognitionException("from value should be less than to value in BETWEEN clause");但是antlr并不像上面那样接受。

在java类中,我通过Antlr调用生成的java类。我的处理方式如下。

try
{
    parser.numberRangeCheck();
}
catch (RecognitionException e)
{
    throw createException("Invalid Business logic syntax at  " + parser.getErrorHeader(e) + ", " + parser.getErrorMessage(e, null), Level.INFO, logger);
}

任何帮助都会得到满足。

2 个答案:

答案 0 :(得分:0)

为什么不简单地使用自定义错误消息抛出RuntimeException

// ...
else throw new RuntimeException("from value should be less than to value in BETWEEN clause");
// ...

答案 1 :(得分:0)

Terrance在“ The De fi nitive ANTLR Reference error chapter excerpt中写道:

  

避免强制使用仅限英语的错误消息,并且通常会产生错误消息   事物尽可能灵活,识别器不会产生异常   带有字符串消息的对象相反,它会跟踪生成错误所需的信息。

因此,RecognitionError的构造函数没有提供错误消息。但您可以定义识别器的其他字段,以保存RecognitionError处理中显示的用户友好错误消息:

numberrange returns [String value]
    :   numberrangesub
        {

        String numberRange = ($numberrangesub.text);
        String [] v = numberRange.split(",");
        if ( Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim()))
            $value = numberRange;
        else {
            this.errorMessage = "from value should be less than to value in BETWEEN clause";
            throw new RecognitionException(this.input);
        }

        }
    ;

然后覆盖getErrorMessage方法:

public String getErrorMessage(RecognitionException e, String[] tokenNames) {
    String msg = this.errorMessage;
    // ...
}

这类似于在相同摘录中解释的释义机制。