2015-08-19 97 views
0

我想通過使用這裏提供的語法Java Grammar來解析特定的方法體。我通過修改起始分析規則(即compilationUnit)來調整語法,使其包含classBodyDeclaration作爲替代。antlr4解析方法體

但是,當試圖解析如下所示的方法體時,它無法給我解析樹。

public static String[] getCNs(X509Certificate cert) { 

LinkedList<String> cnList = new LinkedList<String>(); 
String subjectPrincipal = cert.getSubjectX500Principal().toString(); 
StringTokenizer st = new StringTokenizer(subjectPrincipal, ","); 
while(st.hasMoreTokens()) { 
    String tok = st.nextToken().trim(); 
    if (tok.length() > 3) { 
     if (tok.substring(0, 3).equalsIgnoreCase("CN=")) { 
      cnList.add(tok.substring(3)); 
     } 
    } 
} 

if(!cnList.isEmpty()) { 
    String[] cns = new String[cnList.size()]; 
    cnList.toArray(cns); 
    return cns; 
} else { 
    return null; 
}} 

我使用用於解析如下所示的parseMethodBody功能;

private ParseTree parseMethodBody(String programString, TestErrorListener testErrListener) throws IOException{ 

     CharStream inputCharStream = new ANTLRInputStream(new StringReader(programString)); 
     TokenSource tokenSource = new JavaLexer(inputCharStream); 
     TokenStream inputTokenStream = new CommonTokenStream(tokenSource); 
     JavaParser parser = new JavaParser(inputTokenStream); 

     parser.addErrorListener(testErrListener); 
     tree = parser.compilationUnit(); 
     return tree; 

} 

我能夠解析一些其他的方法體。令我感到意外的是,如果我刪除了LinkedList<String> cnList = new LinkedList<String>();,如果條件爲位於上述方法的底部,則解析成功。任何提示可能會出現什麼問題?生成的JavaLexer/JavaParser文件是否存在問題,某些結構在語法上缺乏支持(因爲語法支持Java7,所以無法確定此語法)。附加信息:附加到解析器的ANTLRErrorListener引發了reportAttemptingFullContext ()作爲虛假的標誌。

+0

我不確定我的理解。你是否在程序體外傳遞了一個程序代碼,並要求ANTLR解析方法體的內部? –

+0

我想解析java方法體的內部。我正在使用用於解析java文件的語法。我通過添加** classBodyDeclaration **作爲備選開始規則來對語法進行簡單的修改,認爲生成的分析器能夠分析完整的java類文件以及java方法體。 – user1577269

回答

0

我調整語法比特通過修改 起始解析規則(即compilationUnit)還包括可 classBodyDeclaration作爲替代。

這打破了語法的基本邏輯,這解釋了何時以及是否生成分析樹的奇怪之處。

只能匹配給定方法的頂級規則正確地爲classBodyDeclaration。用它作爲你的開始規則(不需要修改語法)。

tree = parser.classBodyDeclaration(); 
+0

** typeDeclaration **解析規則與方法聲明不匹配,因爲它具有的替代規則(應該有一個類,enum ....以匹配該規則)。但是,我只對匹配方法體和解析正文內部感興趣。這就是爲什麼我將** classBodyDeclaration **作爲首選備選規則之一。 – user1577269

+0

看起來像方法被封裝在一個塊,但只是SO的格式。答案已更正。如果這不起作用,您可能需要嘗試Java8語法 - 它在處理泛型時可能更加健壯。 – GRosenberg

+0

FWIW,都適合我。 – GRosenberg