我一直在玩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中找到第一个具有特定类型的孩子。
谢谢!
答案 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中。
如果后者实际上是所需的功能,则可以更好/更直接地使用解析树遍历器来获取所需的总体目标。