Я пытаюсь разобрать тело конкретного метода, используя приведенную здесь грамматику Java Grammar. Я немного изменил грамматику, изменив правило начала разбора (например, compilationUnit), чтобы включить в качестве альтернативы класс classBodyDeclaration.antlr4 для разбора метода body
Однако при попытке проанализировать тело метода, например, показанное ниже, оно не дает мне дерева синтаксического разбора.
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, прикрепленный к синтаксическому анализатору, вызывает сообщение AttemptingFullContext() как фальшивый флаг.
Я не уверен, что понимаю. Вы передаете программу с кодом за пределами тела метода и попросите ANTLR проанализировать внутреннюю часть тела метода? –
Я хотел разобрать внутри тела метода java. Я использую грамматику, используемую для разбора java-файла. Я сделал простую модификацию грамматики, добавив ** classBodyDeclaration ** в качестве альтернативного стартового правила, считая, что сгенерированный парсер сможет анализировать полные файлы классов java, а также тела java-методов. – user1577269