是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")
但我需要它来打印SuppressWarnings
(enterAnnotationName
打印的价值
我不知道我哪里出错了。我需要访问enterElementValuePairs中的annotationName。
我该怎么办?
请帮助我,因为我是初学者。
答案 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