我正在尝试使用Java.g4语法和Antlr4解析Java类文件。 有一个特定的解析器规则如下:
classOrInterfaceType
: Identifier typeArguments? ('.' Identifier typeArguments? )*
;
我正在以这种方式在我的访问者类中解析它:
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();
}
这是正确的还是有其他方法可以做到这一点?
答案 0 :(得分:1)
您的方法看起来不错,即使这最终取决于您实际上要做的事情。我的水晶球告诉我你试图通过走解析树来重建原始查询文本。但是,你可以更简单。每个解析上下文都有开始和停止成员,这些成员持有该上下文所代表的解析文本范围的标记。您可以使用它们直接获取与输入完全相同的原始文本(通过令牌流和令牌的位置)。