【记录】尝试antlr的paraphrase去提供对于用户更好友好的错误信息

【背景】

折腾:

【记录】Antlr中的异常处理学习笔记

期间,打算去试试那个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;

然后去看看效果:

when antlr parse error show in variable class value single

即,是可以实现对应的:

当出错时,显示对应的,之前针对那个具体的某个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,在异常处理方面,其实做的已经很不错了。

只是我们要花精力,搞懂如何使用,如何定制,如何实现自己所需要的效果。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量