1 回答

TA貢獻1840條經驗 獲得超5個贊
假設這是你的 parser.g4 語法的頭部 你的整個腳本是一個file,file可以由多個元素組成。元素可以是 apage或 a pageGroup。而且page和pageGroup有其他成分。
parser grammar MyCustomParser;
file: element* EOF;
element: page | pageGroup;
然后一旦你運行 Antlr 命令你會得到許多生成的文件,其中大部分可能命名為MyCustomParser$XXXContext.class. 這些文件代表解析樹中的節點。在我們的例子中,我們將有MyCustomParser.PageContext,MyCustomParser.PageGroupContext等等。
一個特別重要的節點是解析樹的根節點MyCustomParser.FileContext。它的子元素將是元素上下文,元素上下文的子元素將是上面提到的頁面上下文或頁面組上下文。
現在有了這個根節點,你需要做的就是從根開始遞歸訪問解析樹中的所有節點。當您訪問節點時,您可以根據存儲在這些節點中的值生成您的 POJO。
獲取根節點
//....
MyCustomParser parser = new MyCustomParser(tokens);
MyCustomParser.FileContext fileContext = parser.file();
注意我們調用了方法file()。方法名稱與您的根規則名稱相同。
您不必使用生成的樹訪問者。它只是幫助您節省一些鍋爐模板代碼,因為在大多數情況下,我們以相同的方式遍歷這棵樹或那棵樹。
您提到了泛型類型問題。大多數時候,你的 POJO 可能有一個公共的父類,或者實現一個公共的接口。然后你可以只使用父類或接口。但是在您的情況下,您無法修改 POJO,因此使用生成的樹可能并不容易。
添加回答
舉報