Antlr4子上下文索引

时间:2017-07-24 16:55:41

标签: java parsing antlr4

我正在使用Antlr4来解析Java.g4语法文件。我正在使用的解析器规则是:

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

我已按以下方式为此解析器规则实现了visitor方法:

public String visitTypeArgument(JavaParser.TypeArgumentContext ctx) {
    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(" ");    // <- Confusion is here
            typArg.append(this.visitTypeType(typTypCtx));
        }
    }
    else{
        TypeTypeContext typTypCtx = ctx.typeType();
        typArg.append(this.visitTypeType(typTypCtx));
    }
    return typArg.toString();
}

我已经用注释表示我的代码中存在混淆。我正在解析像<? extends SomeClassIdentifier>这样的typeArgument。
为什么ctx.getChild(1).getText()返回“extends”而不是“extends SomeClassIdentifier”? 根据规则'?' (('extends' | 'super') typeType)?,应该只有两个子上下文,一个用于?,另一个用于('extends' | 'super') typeType'。请帮助我清除我的困惑!!!

1 个答案:

答案 0 :(得分:1)

  

根据规则'?' (('extends'|'super')typeType)?应该只有两个子语境,即一个用于?和另一个('extends'|'super')typeType'。

我不认为这是正确的。如果没有看到更多的语法,我认为你应该从这个规则中得到三个孩子,假设输入文本中有可选的(?)短语:

  1. ?作为隐式词法分析器标记
  2. extends super作为隐式词法分析器
  3. typeType作为其自己的子上下文,可能有自己的子集,因为您的规则是递归的,typeType本身可以包含typeType
  4. 这有帮助吗?检查孩子的树,我认为这是有道理的。根据您的输入文本,右递归规则的上下文树可以变得非常深。