将Antlr4解析树添加到另一个Antlr4解析树

时间:2015-04-14 20:27:00

标签: 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 parent,int invokingStateNumber)

RuleContext(RuleContext parent,int invokingState)

具体来说,这些是代表新树的类,我应该将什么传递给invokingState / invokingStateNumber?

1 个答案:

答案 0 :(得分: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
            }
    }