2014-10-01 2 views
1

Являясь новым для рамки 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. Что мне делать?

Просьба помочь мне, поскольку я новичок.

+0

Используйте 'ParseTreeWalker ходок = ParseTreeWalker.DEFAULT'. –

ответ

0

Вы не указали копию грамматики, поэтому я могу только догадываться о связи между вашими правилами. Кажется, что родителем является elementValuePairsannotation, неannotationName. Вам необходимо сначала получить доступ к родительскому объекту (AnnotationContext), а затем позвонить AnnotationContext.annotationName(), чтобы получить предыдущего брата ElementValuePairsContext.

Если вы используете unofficial "optimized" release целевого Java, вы можете добавить следующую аннотацию к вашему методу 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

Смежные вопросы