Являясь новым для рамки ANTLR. Я работаю над разбором файла Java. Используя ANTLR, я генерирую JavaLexer, JavaParser, JavaListener, JavaBaseListener
uning org.antlr.v4.Tool Здесь у меня проблема. Я создаю класс, который переопределяет необходимые методы JavaBaseListener
Доступ к родительскому узлу у ребенка в ANTLR 4.4
Вот код:
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 // Содержит основной метод.
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
(валур e напечатано enterAnnotationName
Я не знаю, где я ошибся. Мне нужно получить доступ к имени annotationName внутри enterElementValuePairs. Что мне делать?
Просьба помочь мне, поскольку я новичок.
Используйте 'ParseTreeWalker ходок = ParseTreeWalker.DEFAULT'. –