簡體   English   中英

ANTLR4 Visitor方法用於替代規則

[英]ANTLR4 Visitor method for alternate rules

我正在嘗試使用Java.g4(來自Antlr4 github網站)語法和Antlr4解析Java類文件。 我正在嘗試解析

typeArguments
:   '<' typeArgument (',' typeArgument)* '>'
;

typeArgument
:   typeType
|   '?' (('extends' | 'super') typeType)?
;

如何解析類型為“?extended 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;
}
}

編輯 :我現在已經以這種方式實現。 感謝@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都只是便捷函數,最終最終位於解析上下文的子上下文中。 因此,對於類似這樣的特殊情況(以及當您不確定如何訪問非個性化元素時),將遍歷子上下文以了解被識別的內容。

在您的情況下,您可能可以使用第一個子上下文來查看這是否是一個問號。 如果是這樣,則選擇第二個替代項,否則選擇第一個。 對於第二個替代項,然后可以檢查第二個子項,以查看其是否為extendssuper ,最后是typeType的下一個子typeType (或者,根據需要使用上下文的typeType()函數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM