【背景】
继续折腾antlr的异常处理。
此处,是已知:
antlr的语法中,已经默认就支持了异常的恢复,即内部实现中,遇到一些异常,比如MismatchedSetException,已经会去:
捕获异常
恢复异常
记录异常信息
比如:
catch (RecognitionException re) { reportError(re); recover(input,re); retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); }
所以,也就无需手动再去写类似的异常恢复的代码了。
但是,希望在后续的解析树的时候,能够判断某个节点,是否已经出现异常了。
从而采取相应措施,比如直接扔掉不处理,等等。
所以,此处需要:
针对某个树节点,判断是否已经是异常了。
【折腾过程】
1.期间,需要搞懂:
2.然后,是通过如下代码:
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(); Object payloadRoot = parseTree.payload; ParseTree parseTreeVaraible = (ParseTree) parseTree.getChild(0).getChild(0); ParseTree parseTreeVaraibleVaraibleBody = (ParseTree) parseTreeVaraible.getChild(3); ParseTree parseTreeVaraibleBodyClass = (ParseTree) parseTreeVaraibleVaraibleBody.getChild(1).getChild(0); ParseTree parseTreeVaraibleBodyClassValue = (ParseTree) parseTreeVaraibleBodyClass.getChild(1); ParseTree parseTreeVaraibleBodyClassValueSingle = (ParseTree) parseTreeVaraibleBodyClassValue.getChild(0); ParseTree parseTreeVaraibleBodyClassValueSingleCommon = (ParseTree) parseTreeVaraibleBodyClassValueSingle.getChild(0); ParseTree parseTreeVaraibleBodyClassValueSingleCommonClass = (ParseTree) parseTreeVaraibleBodyClassValueSingleCommon.getChild(0); String commonClassTreeStr =parseTreeVaraibleBodyClassValueSingleCommonClass.toStringTree(); System.out.println("commonClassTreeStr=" + commonClassTreeStr); int commonClassType =parseTreeVaraibleBodyClassValueSingleCommonClass.getType(); System.out.println("commonClassType=" + commonClassType); Class commonClassValue = parseTreeVaraibleBodyClassValueSingleCommonClass.getClass(); System.out.println("commonClassValue=" + commonClassValue); String commonClassName = commonClassValue.getName(); System.out.println("commonClassName=" + commonClassName); Object objPayload = parseTreeVaraibleBodyClassValueSingleCommonClass.payload; String payloadClassName =objPayload.getClass().getName(); System.out.println("payloadClassName=" + payloadClassName); boolean isException = false; isException = objPayload instanceof RecognitionException; System.out.println("isException=" + isException);
可以判断出,我所关心的,某个叶子节点parseTreeVaraibleBodyClassValueSingleCommonClass是否是RecognitionException。
即,判断某个数节点,是否是antlr的异常。
注:
RecognitionException是antlr的异常的root class。
输出为:
D:/DevRoot/eclipse/common_root/EddlVariableErrorHandle/src/demoEddlVariableError.ddl line 5:12 mismatched input 'INPUT1' expecting set null commonClassTreeStr=MismatchedSetException(12!=null) commonClassType=0 commonClassValue=class org.antlr.runtime.tree.ParseTree commonClassName=org.antlr.runtime.tree.ParseTree payloadClassName=org.antlr.runtime.MismatchedSetException isException=true
如图:
【总结】
此处,最终对于antlr的某个树节点:
parseTreeVaraibleBodyClassValueSingleCommonClass
判断是否有异常,是通过:
ParseTree parseTreeVaraibleBodyClassValueSingleCommonClass = (ParseTree) parseTreeVaraibleBodyClassValueSingleCommon.getChild(0); Object objPayload = parseTreeVaraibleBodyClassValueSingleCommonClass.payload; //String payloadClassName =objPayload.getClass().getName(); //System.out.println("payloadClassName=" + payloadClassName); boolean isException = false; isException = objPayload instanceof RecognitionException; System.out.println("isException=" + isException);
即可。
转载请注明:在路上 » 【记录】antlr异常处理:在ParseTree去getTree之后,判断某个树节点是否出现异常