ANTLR将Java文件转换为XML并读回XML以创建Java对象问题

ANTLR将Java文件转换为XML并读回XML以创建Java对象问题,antlr,antlr3,Antlr,Antlr3,好的。。。这就是我想做的 从某种表达式语言生成Java类 假设步骤#1已完成。。。我有Java文件。在修改了Java.g之后,我使用Java.g文件创建了JavaLaxer和JavaParser(http://jumbleagilemanuals.blogspot.com/2008/03/10-steps-to-beginning-to-parsing-with.html) 我正在使用antlr-3.3-complete.jar获取AST树。现在我已经编写了一个测试类,在这个类中我获得了Comm

好的。。。这就是我想做的

  • 从某种表达式语言生成Java类
  • 假设步骤#1已完成。。。我有Java文件。在修改了Java.g之后,我使用Java.g文件创建了JavaLaxer和JavaParser(http://jumbleagilemanuals.blogspot.com/2008/03/10-steps-to-beginning-to-parsing-with.html)
  • 我正在使用antlr-3.3-complete.jar获取AST树。现在我已经编写了一个测试类,在这个类中我获得了CommonTree对象(请参阅下面的代码)
  • 现在我想把AST树转换成XML输出,这样我就可以把它保存在DB中
  • 我想写一个Reader类,它可以读取XML文件并创建Java源代码
  • 使用该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();  
    

    我正在努力完成第四步到第六步。。。我还没找到解决办法

    我不是ANTLR专家

    但是,步骤4应该非常简单。定义要在AST中漫游的访问者。对于每个树节点,写出:

      <node type="*type*" value="*value*"> *child1* ... *childn* </node>
    
    *child1**儿童*
    
    其中,child_i是子类型的XML。(我们这样做几乎完全是为了 我在商业上提供的类似ANTLR的系统;这是内置的)

    对于步骤5,您需要一个XML读取器,并了解如何构造ANTLR节点。读取生成的文本并构建XML树。遍历该树,从下到上,通过调用ANTLR节点构造函数来构造ANTLR节点

    据推测,ANTLR将预打印它所拥有的Java树,解决6)


    大概在预打印之后,您必须在生成的文件上运行javac,然后使该文件被类加载。

    我不是ANTLR专家

    但是,步骤4应该非常简单。定义要在AST中漫游的访问者。对于每个树节点,写出:

      <node type="*type*" value="*value*"> *child1* ... *childn* </node>
    
    *child1**儿童*
    
    其中,child_i是子类型的XML。(我们这样做几乎完全是为了 我在商业上提供的类似ANTLR的系统;这是内置的)

    对于步骤5,您需要一个XML读取器,并了解如何构造ANTLR节点。读取生成的文本并构建XML树。遍历该树,从下到上,通过调用ANTLR节点构造函数来构造ANTLR节点

    据推测,ANTLR将预打印它所拥有的Java树,解决6)


    大概在预打印之后,您必须在生成的文件上运行javac,然后使该文件被类加载。

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

    1) 生成AST树,在DB中保存为XML,在需要时检索XML,生成AST树,如果需要一些更改,则对其进行修改,将AST树转换为Java源,将Java源编译为类,在运行时将对象加载到内存中并使用它

    2) 实现扩展接口的Java类。。使用RADIDE实现新Impl。。。转换实现AST树,在数据库中另存为xml,在需要时检索回xml,生成AST树,将AST树转换为Java源代码,通过父接口实现将Java源代码编译为类,通过Factory模式将对象加载到内存中(可以加载原实现或在此步骤中创建的新实现)


    我是ANTLR的新手,所以很难理解它是如何工作的。。我希望一旦我将Java转换成AST树,我就可以轻松地序列化它。。。我还希望有一种简单的方法来检索AST序列化对象,在内存中创建AST树,并从中轻松创建Java源代码。我讨厌没有太多的例子可以使用它

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

    1) 生成AST树,在DB中保存为XML,在需要时检索XML,生成AST树,如果需要一些更改,则对其进行修改,将AST树转换为Java源,将Java源编译为类,在运行时将对象加载到内存中并使用它

    2) 实现扩展接口的Java类。。使用RADIDE实现新Impl。。。转换实现AST树,在数据库中另存为xml,在需要时检索回xml,生成AST树,将AST树转换为Java源代码,通过父接口实现将Java源代码编译为类,通过Factory模式将对象加载到内存中(可以加载原实现或在此步骤中创建的新实现)


    我是ANTLR的新手,所以很难理解它是如何工作的。。我希望一旦我将Java转换成AST树,我就可以轻松地序列化它。。。我还希望有一种简单的方法来检索AST序列化对象,在内存中创建AST树,并从中轻松创建Java源代码。我讨厌没有太多的例子可以使用它

    这是我想做的。。。首先,我想将Java文件转换成一些XML,并将其存储在DB中。然后我想读回我的XML文件,并将该XML文件转换为Java文件。。。。然后我想编译我的Java文件并在运行时创建对象。。。。我之所以想这么做,是因为我们希望能够在运行时注入新的Java对象,而无需重新启动服务器。我们还可能最终改变现有Java对象的功能。我认为ANTLR是正确的方法…但我正在努力寻找解决方案。如果您只想“注入”具有相同树的新对象,那么没有太多理由这样做;你可以用原文。所以真正的我