我试图通过使用此处提供的语法来解析特定的方法体Java Grammar。我通过修改起始解析规则(即compilationUnit)对语法进行了一些调整,以将classBodyDeclaration也包括在内作为替代。
但是,当尝试解析如下所示的方法体时,它无法给我解析树。
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>();
的if 条件,则解析成功。任何提示这里可能出了什么问题?生成的 JavaLexer/JavaParser 文件是否存在问题,某些结构的语法缺乏支持(不确定这一点,因为语法支持 Java7).... 附加信息:附加到解析器的 ANTLRErrorListener 引发了reportAttemptingFullContext( )作为错误标志。