簡體   English   中英

用於解析方法主體的antlr4

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM