将 Antlr4 解析树添加到另一个 Antlr4 解析树
Adding an Antlr4 parse tree to another Antlr4 parse tree
我需要用 Antlr4 实现泛型。为了做到这一点,我需要能够获取一个 class 并在使用时像宏一样为其动态生成代码,标记该代码,生成一棵树,然后将新树添加到我原来的解析树。
我看到了这两个classes
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)
具体来说,这些是代表新树的 classes 吗?我应该将什么传递给 invokingState/invokingStateNumber?
原来如此简单
在遍历第一棵树时,它会正确显示来自两个文件的信息。
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
}
}
我需要用 Antlr4 实现泛型。为了做到这一点,我需要能够获取一个 class 并在使用时像宏一样为其动态生成代码,标记该代码,生成一棵树,然后将新树添加到我原来的解析树。
我看到了这两个classes
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)
具体来说,这些是代表新树的 classes 吗?我应该将什么传递给 invokingState/invokingStateNumber?
原来如此简单
在遍历第一棵树时,它会正确显示来自两个文件的信息。
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
}
}