替代规则的 ANTLR4 访问者方法
ANTLR4 Visitor method for alternate rules
我正在尝试使用 Java.g4(来自 Antlr4 github 站点)语法和 Antlr4 解析 Java class 文件。我正在尝试解析
typeArguments
: '<' typeArgument (',' typeArgument)* '>'
;
typeArgument
: typeType
| '?' (('extends' | 'super') typeType)?
;
如何解析类型为“?extends typeType”或“?super typeType”的字符串?下面是我的访客 class.
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
只是方便函数,最终在解析上下文的 child 上下文中结束。因此,对于这样的特殊情况(以及当您不确定如何访问单个元素时),遍历 child 上下文以了解识别的内容。
在您的情况下,您可能可以使用第一个 child 上下文来查看它是否是一个问号。如果是这样,则选择第二个 alt,否则选择第一个。对于第二个 alt,您可以检查第二个 child 以查看它是 extends
还是 super
,最后检查下一个 child 是否为 typeType
(或使用context 的 typeType()
功能,如您所愿)。
我正在尝试使用 Java.g4(来自 Antlr4 github 站点)语法和 Antlr4 解析 Java class 文件。我正在尝试解析
typeArguments
: '<' typeArgument (',' typeArgument)* '>'
;
typeArgument
: typeType
| '?' (('extends' | 'super') typeType)?
;
如何解析类型为“?extends typeType”或“?super typeType”的字符串?下面是我的访客 class.
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
只是方便函数,最终在解析上下文的 child 上下文中结束。因此,对于这样的特殊情况(以及当您不确定如何访问单个元素时),遍历 child 上下文以了解识别的内容。
在您的情况下,您可能可以使用第一个 child 上下文来查看它是否是一个问号。如果是这样,则选择第二个 alt,否则选择第一个。对于第二个 alt,您可以检查第二个 child 以查看它是 extends
还是 super
,最后检查下一个 child 是否为 typeType
(或使用context 的 typeType()
功能,如您所愿)。