2014-10-01 46 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(valur e打印enterAnnotationName 我不知道我出錯的地方。我需要訪問enterElementValuePairs中的annotationName。 我該怎麼辦?

請幫助我,因爲我是一個初學者。

+0

使用'ParseTreeWalker沃克= ParseTreeWalker.DEFAULT'。 – 2015-03-20 18:37:05

回答

0

你不包括語法的一個副本,所以我只能猜測你的規則之間的關係。看來的elementValuePairs父爲annotationannotationName。首先,您需要訪問父(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