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);
}
任何帮助都会得到满足。
答案 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;
// ...
}
这类似于在相同摘录中解释的释义机制。