Java.g4(Antlr4 githubサイトの)文法とAntlr4を使用してJavaクラスファイルを解析しようとしています。私は解析しようとしていますANTLR4代替ルールの訪問者メソッド
typeArguments
: '<' typeArgument (',' typeArgument)* '>'
;
typeArgument
: typeType
| '?' (('extends' | 'super') typeType)?
;
"?extends typeType"または "?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;
}
}
編集:私は今、このように実装しています。 ctx.typeType()
とctx.typeArgument
などの
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();
}