【发布时间】: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