2011-04-06 73 views
1

好吧......这就是我想做的事.....ANTLR的Java文件转换为XML并回读XML创建Java对象发行

  1. 一些表达式语言生成Java类...
  2. 假设第一步完成...我有Java文件。我在修改Java之后创建了JavaLaxer和JavaParser,使用Java.g文件(http://jumbleagilemanuals.blogspot.com/2008/03/10-steps-to-ginning-to-parsing-with.html)
  3. 我正在使用antlr-3.3-complete.jar来获取AST树。现在我写了测试类,我正在获取CommonTree对象(请参阅此列表下面的代码)...
  4. 现在我想将AST树转换为XML输出,以便我可以将它保存在数据库中...
  5. 我想写Reader类可以读取XML文件,并创建Java源..
  6. 使用Java源代码,以在运行时创建对象...


static final TreeAdaptor adaptor = new CommonTreeAdaptor() {  
    @Override 
    public Object create(Token payload) {  
     CommonTree cTree = new CommonTree(); 
     cTree.token = payload; 
     return cTree;   
    }  
}; 

CharStream c = new ANTLRFileStream(
       "C:/Documents and Settings/kkk/IBM/rationalsdp/workspace17"+ 
       "/myproject/src/main/java/com/xyz/abc/infrastructure/"+ 
       "email/service/impl/EmailServiceImpl.java"); 

JavaLexer lexer = new JavaLexer(c); 

CommonTokenStream tokens = new CommonTokenStream();   
tokens.setTokenSource(lexer); 

JavaParser parser = new JavaParser(tokens); 
parser.setTreeAdaptor(adaptor); 

/* AST tree for my java code */ 
CommonTree tree = (CommonTree) parser.compilationUnit().getTree(); 

我挣扎步骤4到步骤6 ...我还找不到解决方案!

+0

这是我想要做的...首先,我想将Java文件转换为一些XML并将其存储在数据库中。然后,我想读回我的XML文件,并将该XML文件转换为Java文件....然后,我想编译我的Java文件并在运行时创建对象。原因为什么我想要做所有这些是因为我们想要有能力在运行时注入新的Java对象而无需重新启动服务器。我们也可能最终改变现有的Java对象的功能。我认为ANTLR是正确的方式...但是我为找不到解决方案而苦苦挣扎。 – 2011-04-06 18:35:02

+0

如果你想要做的是“注入”具有相同树木的新对象,没有太多的理由这样做;你可以使用原文。因此,真正的问题在于阅读其中一个XML树,并决定在哪里进行更改并进行更改。你打算怎么做? – 2011-04-06 22:43:47

回答

1

我不是ANTLR的专家。

但是,第4步应该非常简单。定义一个访问者来走AST。对于每个树节点,请写出:

<node type="*type*" value="*value*"> *child1* ... *childn* </node> 

其中child_i是子类型的XML。 (我们几乎正是为 做了这个ANTLR-like系统,我提供商业上的;这是内置的)。

对于第5步,您需要一个XML阅读器,并了解如何构建ANTLR节点。阅读生成的文本并构建一个XML树。走这棵树,从底部开始,通过调用ANTLR节点构造函数构造ANTLR节点。

推测ANTLR会打印出一个Java树,解决问题6)。

想必在完成打印后,您必须在生成的文件上运行javac,然后导致该文件被类加载。

+0

似乎我不太对。 ANTLR不提供任何特定的功能来打印树。你可以写下你自己的漂亮打印机,通过走树并吐出tet。事实证明,这比听起来更复杂。看到我的回答http://stackoverflow.com/a/5834775/120163 – 2014-06-20 04:24:58

0

@Ira,谢谢你的回答。我会明天尝试一下,让你知道它是如何发展的。很可能我不必遍历Tree并更改节点,但这是一种可能性。业务需求还不是很清楚,所以我不确定我将如何实现动态代码生成。它可能是以下技术的组合...

1)生成AST树,以DB格式保存为XML,根据需要检索回XML,生成AST树,如有需要可进行修改,将AST树转换为Java源码,将Java源代码编译成类,在运行时在内存中加载对象并使用它。

2)实现扩展接口的Java类。使用RAD IDE实现新的Impl ...转换Impl AST树,保存在db中作为xml,需要恢复为xml,生成AST树,将AST树转换为Java源代码,借助于父接口实现将Java源代码编译成类,在Factory的帮助下将对象加载到内存中模式(可以加载原始IMPL或在此步骤中创建的新IMPL)

我是ANTLR的新手,所以很难理解它是如何工作的。我希望将Java转换为AST树后,我可能能够轻松地序列化它...我也希望必须有简单的方法来取回AST序列化对象并在内存中创建AST树并从中轻松创建Java源代码。我讨厌没有太多的例子可以使用它。