簡體   English   中英

如何使用 ANTLR4 獲取 class 字段名稱?

[英]How to get class field name using ANTLR4?

我有 java9 源代碼,我需要使用 antlr4 提取某些類的字段。 這是我的聽眾:

private static class FieldListener extends Java9BaseListener {

        @Override
        public void enterFieldDeclaration(Java9Parser.FieldDeclarationContext ctx) {
            for (ParseTree subTree : ctx.children) {
                System.out.println(subTree.getText());
            }
            String fieldName = ??????;
        }

    }

這是代碼

        //Now, let's do some testing. First, we construct the lexer:
        Java9Lexer java9Lexer = new  Java9Lexer(CharStreams.fromString(classContent));

        //Then, we instantiate the parser:
        CommonTokenStream tokens = new CommonTokenStream(java9Lexer);
        Java9Parser parser = new Java9Parser(tokens);
        ParseTree tree = parser.compilationUnit();

        //And then, the walker and the listener:
        ParseTreeWalker walker = new ParseTreeWalker();
        walker.walk(new FieldListener(), tree);

但是,我只能迭代所有字段標記,但無法獲取特定標記 - class fieldName。 誰能說說怎么獲得?

這里沒有火柴子彈。 Static 語義分析並不容易,因為你必須繞着一棵樹跑。 但這是直截了當的。 您將不得不通過樹遍歷從variableDeclaratorList中提取字段的名稱。 如果為某些輸入打印出解析樹,您可以看到variableDeclaratorList包含variableDeclarator列表,每個variableDeclaratorId包含一個variableDeclaratorId ,每個variableDeclaratorId包含一個帶有可選dims標識符,每個標識符都是標記JavaLetter和更多JavaLetterOrDigit的子樹。 你應該如何計算解析樹的屬性? 這取決於你。 通常,人們使用這個 Antlr 偵聽器框架來計算綜合屬性。 您可以定義從節點到包含屬性的數據結構的映射,這樣當您想要樹中較低節點的屬性時,您可以進行查找(在這種情況下,可能會生成variableDeclaratorList的字符串列表?)。 您可以使用該子節點的訪問器 function 訪問特定節點,這樣您就不必計算直接后代的屬性。 查看生成的解析器代碼。 您可以看到可用的內容,例如 FieldDeclarationContext.variableDeclaratorList()。 或者,如果您願意,您可以調用 function 來派生此特定variableDeclaratorList的屬性,而不是使用 Antlr 偵聽器框架。 Antlr Listener沒有到 walk 的短路,所以請注意,如果您編寫自己的 function 來遍歷variableDeclaratorList ,您可能不想使用偵聽器 ParseTreeWalker.walk()而是使用ParseTreeVisitor.visit() .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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