ANTLR4:带有ParseTree的getFirstChildWithType

时间:2018-07-01 10:54:06

标签: antlr4

我一直在玩ANTLR4,试图转换ANTLR3项目。

我已经根据来自官方存储库的ANLTR4语法生成了词法分析器,解析器和访问者类。在访问者中,我使用访问者提供的ctx调用我的班级之一:

myFunction(ctx.getChild(0))

然后,在myFunction中,我想检索第一个具有特定类型的孩子,所以我尝试这样做:

final ParseTree classNameElement =
            (ParseTree) ((GrammarAST) node).getFirstChildWithType(MyParser.IDENTIFIER);

其中node是myFunction的参数,因此是ParseTree。 getFirstChildWithType似乎仅在GrammarAST中可用,因此强制转换。

我遇到了错误:无法转换为org.antlr.v4.tool.ast.GrammarAST

所以也许这是不可能的,我一定错过了一些东西,但是我想从ParseTree中找到第一个具有特定类型的孩子。

谢谢!

1 个答案:

答案 0 :(得分:1)

请注意,GrammarAST在ANTLR tool层次结构中。使用生成的解析树,您应该专门处理运行时。

要在解析树节点中搜索给定类型的子代,请执行以下操作:

public ParseTree getFirstChildOfType(ParseTree node, int tokentype) {
    for (int idx = 0; idx < node.getChildCount(); idx++) {
        ParseTree child = node.getChild(idx);
        if (child instanceof TerminalNode) {
            Token token = (Token) child.getPayload();
            if (token.getType() == tokentype) {
                return child;
            }
        }
    }
    return null;
}

这将获得给定类型的第一个直接终端,即子终端。如果需要绝对第一个类型,则将需要递归到非TerminalNodes中。

如果后者实际上是所需的功能,则可以更好/更直接地使用解析树遍历器来获取所需的总体目标。