在ANTLR 4.4中访问Child中的父节点

时间:2014-10-01 09:10:30

标签: java antlr

是ANTLR框架的新手。我正在解析Java文件。使用ANTLR我正在生成JavaLexer, JavaParser, JavaListener, JavaBaseListener uning org.antlr.v4.Tool 我有一个问题。我创建了一个覆盖JavaBaseListener

所需方法的类

以下是代码:

JavaMetaDataReader.java

public class JavaMetaDataReader  extends JavaBaseListener{


    @Override
    public void enterAnnotation(AnnotationContext ctx) 
    {
        System.out.println(ctx.getText());
    }

    @Override
    public void enterAnnotationName(AnnotationNameContext ctx)
    {
        System.out.println(ctx.getText());


    }

    @Override
    public void enterElementValuePairs(ElementValuePairsContext ctx)
    { 
        System.out.println(ctx.getText());
        System.out.println("Parent: "+ctx.getParent().getText());
    }

}

JavaReader.Java //包含main方法。

public class JavaReader {

    public static void main(String[] args) {

        File fileTobeRead = new File("./src/main/java/sample/HelloWord.java");
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(fileTobeRead);

            ANTLRInputStream input = new ANTLRInputStream(fileInputStream);
            JavaLexer lexer = new JavaLexer(input);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            JavaParser parser = new JavaParser(tokens);
            ParseTree tree = parser.compilationUnit(); // parse

            ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker

            JavaMetaDataReader javaMetaDataReader = new JavaMetaDataReader();
            walker.walk(javaMetaDataReader, tree); // initiate walk of tree with listener

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

HelloWorld.java

public class HelloWord {

    @SuppressWarnings(value = "Helloo")
    private void helloWorld() {
        // TODO Auto-generated method stub

    }

}

这里HelloWorld.java是需要解析的文件。 这里我试图访问注释。

enterAnnotation打印:@SuppressWarnings(value="Helloo")

enterAnnotationName打印:SuppressWarnings

enterElementValuePair中的第一个语句打印:value="Helloo"

enterElementValuePair中的第二个语句打印:Parent: @SuppressWarnings(value="Helloo")

但我需要它来打印SuppressWarningsenterAnnotationName打印的价值 我不知道我哪里出错了。我需要访问enterElementValuePairs中的annotationName。 我该怎么办?

请帮助我,因为我是初学者。

1 个答案:

答案 0 :(得分:0)

你没有包含语法副本,所以我只能猜测你的规则之间的关系。 elementValuePairs的父级似乎是annotation不是 annotationName。您需要先访问父级(AnnotationContext),然后调用AnnotationContext.annotationName()以获取ElementValuePairsContext的上一个兄弟。

如果您正在使用Java目标的unofficial "optimized" release,则可以在enterElementValuePairs方法中添加以下注释,以确保在以后使用elementValuePairs时报告编译器错误以一种破坏这种方式的方式来统治。请注意,这需要在修改语法时使用@version{}操作,如下面的链接所述。

@RuleDependencies({
  @RuleDependency(recognizer=JavaParser.class, rule=JavaParser.RULE_elementValuePairs,
                  version=0, dependents={Dependents.PARENTS, Dependents.DESCENDANTS}),
  @RuleDependency(recognizer=JavaParser.class, rule=JavaParser.RULE_annotation,
                  version=0, dependents=Dependents.SELF),
  @RuleDependency(recognizer=JavaParser.class, rule=JavaParser.RULE_annotationName,
                  version=0, dependents=Dependents.DESCENDANTS)
})

有关使用规则依赖关系的更多信息,请访问: https://github.com/sharwell/antlr4/wiki/Rule-Versioning