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

【记录】用antlr的preprocess去预处理一个新的eddl文件去除eddl中不支持的元素对应的文件内容

ANTLR crifan 3174浏览 0评论

【背景】

拿到一个新的(hart的)dd(eddl)文件,现在其中有些element(元素)不支持,所以需要手动处理一下。

但是需要先去用之前的antlr的preprocess.g去预处理一下,处理其中的include文件,宏定义等内容。

【折腾过程】

1.在Eclipse中弄了个新的java项目:

antlrPreprocessTest

然后把对应的preprocess.g

然后把preprocess.g,通过antlrworks编译生成的,非debug版本的:

preprocessLexer.java

preprocessParser.java

加载到项目中,然后再写个测试文件:

antlrPreprecessTest.java

内容如下:

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
75
76
77
78
/**
 * [File]
 * antlrPreprecessTest.java
 *
 * [Function]
 * test antlr preprocess
 * do preprcess for input origin eddl file
 *
 * [Version]
 * 2013-10-16
 *
 * @author Crifan Li
 */
 
import java.io.IOException;
import java.util.Date;
 
import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CharStream;
//import org.antlr.runtime.*;
import org.antlr.runtime.Token;
 
public class antlrPreprecessTest {
    static crifanLib crl;
     
    /**
     * @param args
     */
    public static void main(String[] args) {
        crl = new crifanLib();
 
        // TODO Auto-generated method stub
        preprcessTest();
 
    }
     
    public static void preprcessTest()
    {
        String currentPath = "D:/DevRoot/eclipse/common_root/antlrPreprocessTest/src/";
        String ddFile = "";
        ddFile = "yamatake_dtsj3000_ypress_removedUpsuppoted.ddl";
        //ddFile = "test_expr.ddl";
        String ddFullFilename = currentPath + ddFile;
        CharStream cs = null;
        try {
            cs = new ANTLRFileStream(ddFullFilename);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
         
        preprocessLexer lexer = new preprocessLexer(cs);
        Token token;
        String processedStr = "";
        token = lexer.nextToken();
        //while (token != Token.EOF_TOKEN) {
        while (true) {
            processedStr += token.getText();
            //System.out.println(token.getText());
          //System.out.println(token.getType() + " :: " + token.getText());
          token = lexer.nextToken();
           
          if(token.getType() == preprocessLexer.EOF) {
              break;
            }
        }
         
        System.out.println(processedStr);
         
        Date curDate = new Date();
        String curDatetimeStr = crl.dateToString(curDate, "yyyy-MM-dd_hhmmss"); //2013-07-08_033034
 
        String outputFilename = "processedStr_" + curDatetimeStr + ".txt";
        String outputfullFilename = currentPath + outputFilename;
        crl.outputStringToFile(processedStr, outputfullFilename);
    }
 
}

接着可以去调试了。

2.期间,出现出错,但是始终找不到错误的原因,所以希望是:

也是像之前一样,第一次出错,就退出:

【已解决】在用antlr预处理一个新的hart的eddl文件时希望第一次出错就退出

3.接着,再起给其添加源码级调试:

【记录】在Eclipse中给ANTLR添加源码实现ANTLR的源码级的调试

4.然后由于此处输出错误信息很少,所以再去想办法输出更详细的错误信息:

【记录】用antlr预处理异常MismatchedTokenException时能输出更详细的信息

 

【总结】

转载请注明:在路上 » 【记录】用antlr的preprocess去预处理一个新的eddl文件去除eddl中不支持的元素对应的文件内容

发表我的评论
取消评论

表情

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

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