0
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);
}

任何帮助都会得到帮助。

4

2 回答 2

0

为什么不简单地RuntimeException用您的自定义错误消息抛出一个?

// ...
else throw new RuntimeException("from value should be less than to value in BETWEEN clause");
// ...
于 2010-02-16T09:33:52.777 回答
0

正如 Terrance 在“ The Definitive ANTLR Reference错误章节摘录中所写:

为了避免强制只显示英文错误消息,并且通常使事情尽可能灵活,识别器不会使用字符串消息创建异常对象。相反,它会跟踪生成错误所需的信息。

所以没有提供给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;
    // ...
}

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

于 2011-05-16T11:17:54.133 回答