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

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

如何保存 ANTLR 生成的 AST

如何保存 ANTLR 生成的 AST

一只萌萌小番薯 2023-06-20 10:30:33
我已經在 python 中使用 ANTLR 成功生成了一個 AST,但我終生無法弄清楚如何保存它以備后用。我能想到的唯一選擇是使用tree.toStringTree()方法,但它的輸出很混亂,而且不太方便或易于使用。我如何保存它以及哪種格式最好/最容易使用并且能夠在將來可視化和加載它?編輯:我可以在 java 文檔中看到有一個 DotGenerator() 來生成樹的 DOT 文件,但我找不到在 python 中執行此類操作的方法。
查看完整描述

1 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

您正在尋找的是解析樹的序列化器/反序列化器。它在運行時 (ASAIK) 中不受支持,因為它沒有用:可以通過重新解析輸入來非常快速地重建樹。即使您想使用轉換來更改樹,您也可以將樹中的節點替換為具有您的解析器中甚至不存在的節點類型的子樹,打印出樹,然后重新解析以重建樹使用語法的解析類型。只有在使用語義分析進行解析非常慢時才有意義。所以,你應該仔細考慮這個問題。

然而,編寫一個不考慮間距或注釋等“頻道外”內容的粗略序列化器/反序列化器并不困難。這個 C# 程序(您可以將其改編為 python)是一個使用grammars-v4/sexpression.g4語法為目標語法arithmetic.g4重建樹的示例。使用toStringTree(rule-names),樹首先被序列化為一個字符串。(請注意,toStringTree()沒有解析器規則名稱很難閱讀,這就是我問的原因。)然后,解析 s 表達式并使用 Antlr 訪問器執行自下而上的重建。自從toStringTree()沒有用標記的類型標記解析樹葉子(例如,區分數字和符號),字符串被詞法化以重建值。它還使用反射來創建正確的解析樹節點類型。

為解析樹輸出點圖也很容易,我將其包含在程序中,使用自上而下的遞歸訪問器。在這里,遞歸函數將每條邊輸出到特定節點的子節點。由于每個節點名稱必須是唯一的(它是一棵樹),因此我將節點的預購樹編號添加到名稱中。

--肯


查看完整回答
反對 回復 2023-06-20
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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