使用访问者访问 Antlr4 中规则上下文的子上下文

Accessing sub context of a rule context in Antlr4 using visitor

我正在尝试使用 Java.g4 语法和 Antlr4 解析 Java class 文件。 有一个特定的解析器规则如下:

classOrInterfaceType
:   Identifier typeArguments? ('.' Identifier typeArguments? )*
;

我在访问者 class 中以这种方式解析它:

public String visitClassOrInterfaceType(JavaParser.ClassOrInterfaceTypeContext ctx) {
    StringBuilder clsIntr = new StringBuilder("");
    int n = ctx.getChildCount();
    for(int i = 0; i < n; i++){
        TerminalNode id = ctx.Identifier(i);
        if(id!=null){
            clsIntr.append(id.getText()).append(" ");
        }
        TypeArgumentsContext typArgCtx =ctx.typeArguments(i);
        if(typArgCtx!=null){
            String val = this.visitTypeArguments(typArgCtx);
            clsIntr.append(val);
        }
    }
    return clsIntr.toString();
}

这是正确的还是有其他方法可以做到这一点?

您的方法看起来不错,尽管这最终取决于您实际尝试做什么。我的 crystal 球告诉我您尝试通过遍历解析树来重建原始查询文本。但是,您可以简单得多。每个解析上下文都有开始和停止成员,它们保存此上下文所代表的已解析文本范围的标记。您可以使用它们直接获取与输入时完全相同的原始文本(通过令牌流和令牌的位置)。