ANTLR4 备用规则的访问者方法



我正在尝试使用Java.g4(来自Antlr4 github站点(语法和Antlr4解析Java类文件。我正在尝试解析

typeArguments
:   '<' typeArgument (',' typeArgument)* '>'
;
typeArgument
:   typeType
|   '?' (('extends' | 'super') typeType)?
;

如何解析类型为 "?扩展类型类型"或"?超级类型" ?以下是我的访客课程。

public class TypeArgumentsVisitor extends JavaBaseVisitor<String> {
public String visitTypeArguments(JavaParser.TypeArgumentsContext ctx) { 
String delimiter = "";
StringBuilder typArgSb = new StringBuilder("<");
for(TypeArgumentContext typArg :ctx.typeArgument()){
String arg = visit(typArg);
typArgSb.append(delimiter).append(arg);
delimiter = ",";
}
typArgSb.append(">");
return typArgSb.toString();
}
public String visitTypeArgument(JavaParser.TypeArgumentContext ctx) {
TypeTypeVisitor visitor = new TypeTypeVisitor();
TypeTypeContext typTypCtx = ctx.typeType(); 
if(//condition for first){
// Code for first rule typeType
}
else{
//Code for second rule '?' (('extends' | 'super') typeType)?
}
return null;
}
}

编辑:我现在以这种方式实现。感谢@Mike

public String visitTypeArgument(JavaParser.TypeArgumentContext ctx) {
//TypeTypeVisitor visitor = new TypeTypeVisitor();
StringBuilder typArg = new StringBuilder();
if(ctx.getChild(0).getText().equalsIgnoreCase("?")){
// '?' (('extends' | 'super') typeType)?
typArg.append("?").append(" ");
TypeTypeContext typTypCtx = ctx.typeType();
if(typTypCtx != null){
typArg.append(ctx.getChild(1).getText()).append(" ");
typArg.append(this.visitTypeType(typTypCtx));
}
}
else{
TypeTypeContext typTypCtx = ctx.typeType();
typArg.append(this.visitTypeType(typTypCtx));
}
return typArg.toString();
}

所有上下文访问函数(如ctx.typeType()ctx.typeArgument(都只是方便函数,最终最终出现在解析上下文的子上下文中。因此,对于这样的特殊情况(当您不确定如何访问独立元素时(,请遍历子上下文以了解识别的内容。

在您的情况下,您可能可以使用第一个子上下文来查看这是否是一个问号。如果是这样,则选择第二个替代项,否则选择第一个替代项。对于第二个 alt,您可以检查第二个子项以查看它是extends还是super,最后检查下一个子项以进行typeType(或者使用上下文的typeType()函数,当您呼啸时(。

相关内容

  • 没有找到相关文章

最新更新