我们希望CommonTree有一个访问(OurVisitor visitor)方法,但CommonTree不是生成的类。
现在,我们有了这段代码
ANTLRStringStream stream = new ANTLRStringStream(sql);
NoSqlLexer lexer = new NoSqlLexer(stream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
NoSqlParser parser = new NoSqlParser(tokenStream);
CommonTree tree = (CommonTree) parser.statement().getTree();
我总是可以在树上外化,但在这种情况下调用tree.visit(myVisitor)并让它为树中的每个节点调用OurVisitor.visitNode(Node节点)是很好的。有没有办法做到这一点?
另外,我期待一棵树,如果我有expr = exprType1 | exprtType2 | exprType3 *,我会有一棵
的树ExprType1 exp1 = expr.getExprType1();
ExprType2 exp2 = expr.getExprType2();
List<ExprType3> exp3List = expr.getExprType3()
但是CommonTree不是这种情况。有办法吗?
感谢, 迪安
答案 0 :(得分:1)
是的,您可以让ANTLR生成您自己的AST类(必须扩展ANTLR的Tree
类!),您可以在其中添加自定义方法。
参见this ANTLR Wiki文章,尤其是段落Using custom AST node types。
ANTLR的下一个主要版本version 4将具有自动AST构造,使其易于遍历/迭代。