【背景】
之前折腾了一些一些关于antlr的异常处理了:
【记录】尝试折腾antlr v3的异常处理和错误恢复:VARIABLE的CLASS的值INPUT故意写错为INPUT1
【记录】折腾antlr的异常处理:使得当初错时,输出更详细的错误信息,包含堆栈信息
【整理】antlr的Exception Handling异常处理中的异常Exception的类型
现在继续参考:
The Definitive ANTLR Reference.pdf
去试试,关于,当遇到第一个错误,就退出,不继续解析。
其背景是:
antlr默认已经实现了错误恢复机制,即,遇到错误时,尝试恢复错误,不会挂掉,可以往后继续解析的。
【折腾过程】
1.然后去试了试作者给的代码,结果出错了:
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; } }
去测试,结果是:
即,的确是:
当出现了一个错误后,此处是:
MismatchedSetException
然后就不解析了,就调转到代码中的:
catch (RecognitionException e1)
部分,然后调用:
e1.printStackTrace();
去打印出对应的异常时的堆栈信息了。
【总结】
至此,实现了,基本的,当antlr解析时出现错误则就立刻停止解析的效果了。
转载请注明:在路上 » 【记录】antlr的异常处理:遇到第一个错误就停止和退出