我想通過使用這裏提供的語法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 ()作爲虛假的標誌。
我不確定我的理解。你是否在程序體外傳遞了一個程序代碼,並要求ANTLR解析方法體的內部? –
我想解析java方法體的內部。我正在使用用於解析java文件的語法。我通過添加** classBodyDeclaration **作爲備選開始規則來對語法進行簡單的修改,認爲生成的分析器能夠分析完整的java類文件以及java方法體。 – user1577269