ANTLR:通过stringtemplate将修改后的AST翻译成java源代码 [英] ANTLR:Translate the modified AST to java source code by stringtemplate

查看:43
本文介绍了ANTLR:通过stringtemplate将修改后的AST翻译成java源代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 ANTLR wiki 中的语法 Java.g 生成一个词法分析器和Java 源文件的解析器.然后使用以下代码生成抽象语法树(AST).

I use the grammar Java.g from the ANTLR wiki produces a lexer and parser for Java source files.Then use the following code to generate an 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 = new S3Object(_fileName);"通过修改AST节点.在此之后,我想将这个AST翻译成java源代码.我修改JavaTreeParser.g并编写一个stringtemplate并使用以下方法获取java源代码:

Then modify the AST. For example,replace "File file = new File(filepath, fileType);" to "S3Object _file = new S3Object(_fileName);" by modify the AST node. After this,I want to translate this AST to java source code.I modify the JavaTreeParser.g and write a stringtemplate and use the following method to get the java source code:

    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);":

If I don't modify the AST,it will get the java source code correctly,but after I modify the AST,it doesn't get the right java source code(the AST was modified correctly).For example,if I input the following souce code,and translate to AST,then modify "File file = new File(filepath, fileType);" to "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
  }

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

Am I doing it wrong? Is there a more proper way for me to solve this problem?

推荐答案

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

unfortunately I cannot recommend doing source to source translation by rewriting the abstract syntax trees; try using the parse trees. If I remember ANTLR 3 can also generate those easily. Ter

这篇关于ANTLR:通过stringtemplate将修改后的AST翻译成java源代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆