最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【记录】antlr的异常处理:遇到第一个错误就停止和退出

ANTLR crifan 4029浏览 0评论

【背景】

之前折腾了一些一些关于antlr的异常处理了:

【记录】尝试折腾antlr v3的异常处理和错误恢复:VARIABLE的CLASS的值INPUT故意写错为INPUT1

【记录】折腾antlr的异常处理:使得当初错时,输出更详细的错误信息,包含堆栈信息

【整理】antlr的Exception Handling异常处理中的异常Exception的类型

现在继续参考:

The Definitive ANTLR Reference.pdf

去试试,关于,当遇到第一个错误,就退出,不继续解析。

其背景是:

antlr默认已经实现了错误恢复机制,即,遇到错误时,尝试恢复错误,不会挂掉,可以往后继续解析的。

 

【折腾过程】

1.然后去试了试作者给的代码,结果出错了:

【已解决】antlr中尝试出错就退出,结果编译parser出错:error: recoverFromMismatchedSet(IntStream,RecognitionException,BitSet) in xxxParser cannot override recoverFromMismatchedSet(IntStream,RecognitionException,BitSet) in BaseRecognizer,return type void is not compatible with Object

2.然后就可以去测试,看看效果了:

还是用之前的代码:

/**
 * 
 */

import java.io.IOException;
import java.util.Date;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.debug.ParseTreeBuilder;
import org.antlr.runtime.tree.ParseTree;

/**
 * @author CLi
 *
 */
public class EddlVariableErrorHandle {
	static crifanLib crl;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		crl = new crifanLib();
		// TODO Auto-generated method stub
		EddlVariableErrorHandleParser();
	}
	
	// for debug mode, using ParseTree
	public static void EddlVariableErrorHandleParser()
	{
		String curPath = "D:/DevRoot/eclipse/common_root/EddlVariableErrorHandle/src/"; 
		String ddFilename = "demoEddlVariableError.ddl";
		
		String ddFullFilename = curPath + ddFilename;
		CharStream cs = null;
		try {
			crl.calcTimeStart("load_dd_file");
			cs = new ANTLRFileStream(ddFullFilename);
			long loadFileTime = crl.calcTimeEnd("load_dd_file"); //43581
			String strLoadFile = "Load DD File\t: " + loadFileTime + " milli sec";

			crl.calcTimeStart("parse_dd");
			EddlVariableErrorHandleLexer lexer = new EddlVariableErrorHandleLexer(cs);
			CommonTokenStream tokens = new CommonTokenStream();
			tokens.setTokenSource(lexer);

			ParseTreeBuilder builder = new ParseTreeBuilder("startParse");

			EddlVariableErrorHandleParser parser = new EddlVariableErrorHandleParser(tokens, builder);
	    	parser.startParse();
			ParseTree parseTree = builder.getTree();
			long parseDDTime = crl.calcTimeEnd("parse_dd"); //11203
			String strparseDDFile = "Parse DD File\t: " + parseDDTime + " milli sec";
			
			String statisticInfo = strLoadFile + "\r\n" + strparseDDFile;
			String curDatetimeStr = crl.dateToString(new Date(), "yyyy-MM-dd_hhmmss"); //2013-07-08_033034
			String statisticFilename = "statisticInfo_" + curDatetimeStr + ".log";
			String statisticFullFilename = curPath + statisticFilename;
			crl.outputStringToFile(statisticInfo, statisticFullFilename);
			//System.out.println(parseTree.toStringTree());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RecognitionException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}	

		return;
	}
}

去测试,结果是:

when found first mismatchset exception jump out

即,的确是:

当出现了一个错误后,此处是:

MismatchedSetException

然后就不解析了,就调转到代码中的:

catch (RecognitionException e1)

部分,然后调用:

e1.printStackTrace();

去打印出对应的异常时的堆栈信息了。

 

【总结】

至此,实现了,基本的,当antlr解析时出现错误则就立刻停止解析的效果了。

转载请注明:在路上 » 【记录】antlr的异常处理:遇到第一个错误就停止和退出

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.192 seconds, using 22.13MB memory