【背景】
折腾:
期间,打算去试试那个paraphrase。
【折腾过程】
1.按照教程,改为如下代码:
//try paraphrases
@members {
Stack paraphrases = new Stack();
public String getErrorMessage(RecognitionException e, String[] tokenNames)
{
String msg = super.getErrorMessage(e, tokenNames);
if ( paraphrases.size()>0 ) {
String paraphrase = (String)paraphrases.peek();
msg = msg+" "+paraphrase;
}
return msg;
}
}
variable_class
@init { paraphrases.push("in variable class"); }
@after { paraphrases.pop(); }
: 'CLASS' class_value ';' ;
class_value
@init { paraphrases.push("in variable class value"); }
@after { paraphrases.pop(); }
: single_class_value ('&' single_class_value)*;
single_class_value
@init { paraphrases.push("in variable class value single"); }
@after { paraphrases.pop(); }
: common_class;然后去看看效果:
即,是可以实现对应的:
当出错时,显示对应的,之前针对那个具体的某个rule所添加的,人性化的信息,比如执行到哪一个步骤了
此处是:
| in variable class value single |
所以,整体报错的信息是:
D:/DevRoot/eclipse/common_root/EddlVariableErrorHandle/src/demoEddlVariableError.ddl line 5:12 mismatched input ‘INPUT1’ expecting set null in variable class value single |
至此,基本达到了预期效果了。
【总结】
antlr,在异常处理方面,其实做的已经很不错了。
只是我们要花精力,搞懂如何使用,如何定制,如何实现自己所需要的效果。