1

我们希望 CommonTree 有一个 visit(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 node) 会很好。有没有办法做到这一点?

另外,我期待一棵树,如果我有 expr = exprType1 | exprtType2 | exprType3*,我会有一棵树

ExprType1 exp1 = expr.getExprType1();
ExprType2 exp2 = expr.getExprType2();
List<ExprType3> exp3List = expr.getExprType3()

但 CommonTree 并非如此。有没有办法做到这一点?

谢谢,院长

4

1 回答 1

1

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

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

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

于 2012-07-06T18:19:38.183 回答