antlr有没有办法生成访问者代码(通用访问者)

时间:2012-07-06 15:00:32

标签: antlr antlr3

我们希望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不是这种情况。有办法吗?

感谢, 迪安

1 个答案:

答案 0 :(得分:1)

是的,您可以让ANTLR生成您自己的AST类(必须扩展ANTLR的Tree类!),您可以在其中添加自定义方法。

参见this ANTLR Wiki文章,尤其是段落Using custom AST node types

ANTLR的下一个主要版本version 4将具有自动AST构造,使其易于遍历/迭代。