0

我试图通过使用此处提供的语法来解析特定的方法体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( )作为错误标志。

4

1 回答 1

0

我通过修改起始解析规则(即compilationUnit)对语法进行了一些调整,以将classBodyDeclaration 也包括在内作为替代。

这打破了语法的基本逻辑,它解释了何时以及是否生成解析树的奇怪之处。

仅匹配给定方法的顶级规则正确地是classBodyDeclaration. 使用它作为您的开始规则(无需修改语法)。

tree = parser.classBodyDeclaration();
于 2015-08-19T20:12:19.360 回答