2015-04-14 57 views
0

我需要使用Antlr4实现泛型。为了做到这一点,我需要能够接受一个类,并像使用它一样为它动态生成代码,将代码标记化,生成树,然后将该新树添加到我的原始分析树。将Antlr4分析树添加到另一个Antlr4分析树

我看到这两个类

http://www.antlr.org/api/JavaTool/org/antlr/v4/runtime/RuleContext.html

http://www.antlr.org/api/JavaTool/org/antlr/v4/runtime/ParserRuleContext.html

不过,我不知道他们实际上做的,我也不是知道如何使用构造函数。

ParserRuleContext(ParserRuleContext父母,INT invokingStateNumber)

RuleContext(RuleContext父母,INT invokingState)

具体而言,这些将代表新树类,和我应该进入invokingState/invokingStateNumber ?

+0

通常,Antlr4不支持对分析树的直接修改。可能会更好地支持一步,并提出关于您想要做什么的更多细节,可以在何处以及如何实施泛型。 – GRosenberg

+0

不幸的是,除了这种方法之外,没有办法实现泛型。猜猜我会深入到构造函数中,并试图找出那个int参数的作用>:o。 – nestharus

回答

0

显然,这是因为这

容易行走时的第一棵树,它正确地显示来自这两个文件的信息。

public class Program 
    { 
      private static ParserRuleContext getTree(String file) throws Exception 
      { 
        InputStream input = new FileInputStream(file); 
        Reader reader = new InputStreamReader(input); 
        ANTLRInputStream inputStream = new ANTLRInputStream(reader); 

        JavaLexer lexer = new JavaLexer(inputStream); 
        CommonTokenStream tokens = new CommonTokenStream(lexer); 
        JavaParser parser = new JavaParser(tokens); 
        ParserRuleContext tree = parser.compilationUnit(); // parse 

        return tree; 
      } 

      public static void main(String args[]) throws Exception 
      { 
        ParserRuleContext tree1 = getTree("E:\\Users\\nessy\\IdeaProjects\\AntlrTest\\src\\in1.java"); 
        ParserRuleContext tree2 = getTree("E:\\Users\\nessy\\IdeaProjects\\AntlrTest\\src\\in2.java"); 

        tree1.addChild(tree2); 

        ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker 
        JavaWalker extractor = new JavaWalker(); 
        walker.walk(extractor, tree1); // initiate walk of tree with listener 
      } 
    }