【问题标题】:ANTLR:Translate the modified AST to java source code by stringtemplateANTLR:通过stringtemplate将修改后的AST翻译成java源码
【发布时间】:2013-12-19 02:50:04
【问题描述】:

我使用来自ANTLR wiki 的语法Java.g 为Java 源文件生成词法分析器和解析器。然后使用以下代码生成abstract syntax tree (AST)

    ANTLRInputStream input = new ANTLRInputStream(new FileInputStream(fileName));
    JavaLexer lexer = new JavaLexer(input);     // create lexer
    // create a buffer of tokens pulled from the lexer
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    JavaParser parser = new JavaParser(tokens); // create parser
    JavaParser.javaSource_return r = parser.javaSource();   // parse rule 'javaSource'
    /*RuleReturnScope result = parser.compilationUnit();
    CommonTree t = (CommonTree) result.getTree();*/
    // WALK TREE
    // get the tree from the return structure for rule prog
    CommonTree t = (CommonTree)r.getTree();

然后修改 AST。例如,替换“File file = new File(filepath, fileType);”到 “S3Object _file = 新 S3Object(_fileName);”通过修改 AST 节点。在这之后,我想把这个AST翻译成java源代码。我修改了JavaTreeParser.g,写了一个stringtemplate,用下面的方法得到java源代码:

    FileReader groupFileR = new FileReader("src/com/googlecode/zcg/templates/JavaTemplate.stg");
    StringTemplateGroup templates = new StringTemplateGroup(groupFileR);
    groupFileR.close();
    // create a stream of tree nodes from AST built by parser
    CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
    // tell it where it can find the token objects
    nodes.setTokenStream(tokens);
    JavaTreeParser walker = new JavaTreeParser(nodes); // create the tree Walker
    walker.setTemplateLib(templates); // where to find templates
    // invoke rule prog, passing in information from parser
    JavaTreeParser.javaSource_return r2 = walker.javaSource();

    // EMIT BYTE CODES
    // get template from return values struct
    StringTemplate output = (StringTemplate)r2.getTemplate(); 
    System.out.println(output.toString()); // render full template

如果我不修改 AST,它会正确获取 java 源代码,但是在我修改 AST 之后,它没有得到正确的 java 源代码(AST 被正确修改)。例如,如果我输入以下源代码,并转换为 AST,然后修改“File file = new File(filepath, fileType);”到“S3Object _file = new S3Object(_fileName);”:

public void methodname(String address){
    String filepath = "file";
    int fileType = 3;       
    File file = new File(filepath, fileType);
}

结果如下:

public void methodname( String address)
  { 
     String filepath="file";
     int fileType=3;
     methodname (Stringaddress){Stringfilepath;//it's not  what I wanted
  }

我做错了吗?我有没有更合适的方法来解决这个问题?

【问题讨论】:

    标签: java antlr pretty-print abstract-syntax-tree stringtemplate


    【解决方案1】:

    不幸的是,我不建议通过重写抽象语法树来进行源到源的翻译;尝试使用解析树。如果我记得 ANTLR 3 也可以轻松生成这些。 叔

    【讨论】:

    • 谢谢。我需要从树中获取变量的类型并修改树,但是解析树比抽象语法树复杂得多。解析树能完成这样的任务吗?
    • 解析树更大,但更容易进行源到源的翻译。 ANTLR 4.2 会有很大帮助。有关树模式的内容,请参见 master 分支。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多