亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過實現ANTLR生成的Visitor來創建復雜的POJO

如何通過實現ANTLR生成的Visitor來創建復雜的POJO

郎朗坤 2021-07-09 14:01:15
我正在使用 ANTLR4,并為我正在設計的一種新語言編寫了詞法分析器和解析器語法。我想通過解析該語言來創建一個 Java POJO。語{dept dept-name="human resources"}   {emp name="john doe" age=23 address="123 Main St, Spring Field, CO 12345" /}{/dept}Java POJOpublic class Department {  private final class name;  private final List<Employee>}public class Employee {  private final String name;  private final int age;  private final Address address;}public class Address {  private final String streetAddress;  private final String city;  private final String state;  private final int zip;  private final int zipExt;}我已經能夠正確定義語法。我能夠使用 Antlr 工具生成訪問者類。Visitor 類采用泛型類型 T,并在訪問每個節點時返回類型 T 的實例。我需要在訪問 AST 的地址部分時返回一個地址,而在訪問 AST 的員工部分時需要返回一個員工。所以我不確定訪問者實現的類型 T 應該是什么。我對如何通過實現 ANTLR 給出的訪問者來構建上述部門 POJO 感到困惑。PS:請注意,我不能更改部門、員工、地址類。另外,請不要建議使用 XML 或 JSON。我只是想了解如何在 ANTLR 中解決這樣的問題。
查看完整描述

1 回答

?
慕斯709654

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,因此使用生成的樹可能并不容易。


查看完整回答
反對 回復 2021-07-14
  • 1 回答
  • 0 關注
  • 341 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號