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

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

ANTLR crifan 4130浏览 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.然后就可以去测试,看看效果了:

还是用之前的代码:

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;
    }
}

去测试,结果是:

when found first mismatchset exception jump out

即,的确是:

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

MismatchedSetException

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

1
catch (RecognitionException e1)

部分,然后调用:

1
e1.printStackTrace();

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

 

【总结】

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

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

发表我的评论
取消评论

表情

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

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