[英]antlr4 for parsing a method body
我試圖通過使用此處Java語法提供的語法來解析特定的方法主體。 我通過修改起始解析規則(即,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( )作為錯誤標志。
我通過修改起始解析規則(即,compilationUnit)對語法進行了一些微調,使其也包括classBodyDeclaration作為替代。
這打破了語法的基本邏輯,后者解釋了何時以及是否生成解析樹的奇怪之處。
僅匹配給定方法的頂級規則正確地是classBodyDeclaration
。 將其用作您的開始規則(無需另外修改語法)。
tree = parser.classBodyDeclaration();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.