【背景】
之前折腾了一些一些关于antlr的异常处理了:
【记录】尝试折腾antlr v3的异常处理和错误恢复:VARIABLE的CLASS的值INPUT故意写错为INPUT1
【记录】折腾antlr的异常处理:使得当初错时,输出更详细的错误信息,包含堆栈信息
【整理】antlr的Exception Handling异常处理中的异常Exception的类型
现在继续参考:
The Definitive ANTLR Reference.pdf
去试试,关于,当遇到第一个错误,就退出,不继续解析。
其背景是:
antlr默认已经实现了错误恢复机制,即,遇到错误时,尝试恢复错误,不会挂掉,可以往后继续解析的。
【折腾过程】
1.然后去试了试作者给的代码,结果出错了:
2.然后就可以去测试,看看效果了:
还是用之前的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | /** * */ 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
然后就不解析了,就调转到代码中的:
1 | catch (RecognitionException e1) |
部分,然后调用:
1 | e1.printStackTrace(); |
去打印出对应的异常时的堆栈信息了。
【总结】
至此,实现了,基本的,当antlr解析时出现错误则就立刻停止解析的效果了。
转载请注明:在路上 » 【记录】antlr的异常处理:遇到第一个错误就停止和退出