【背景】
折腾:
期间,打算去试试那个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,在异常处理方面,其实做的已经很不错了。
只是我们要花精力,搞懂如何使用,如何定制,如何实现自己所需要的效果。