[英]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
都只是便捷函數,最終最終位於解析上下文的子上下文中。 因此,對於類似這樣的特殊情況(以及當您不確定如何訪問非個性化元素時),將遍歷子上下文以了解被識別的內容。
在您的情況下,您可能可以使用第一個子上下文來查看這是否是一個問號。 如果是這樣,則選擇第二個替代項,否則選擇第一個。 對於第二個替代項,然后可以檢查第二個子項,以查看其是否為extends
或super
,最后是typeType
的下一個子typeType
(或者,根據需要使用上下文的typeType()
函數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.