【背景】
之前折腾了一些一些关于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的异常处理:遇到第一个错误就停止和退出