1 回答

TA貢獻1833條經驗 獲得超4個贊
您正在尋找的是解析樹的序列化器/反序列化器。它在運行時 (ASAIK) 中不受支持,因為它沒有用:可以通過重新解析輸入來非常快速地重建樹。即使您想使用轉換來更改樹,您也可以將樹中的節點替換為具有您的解析器中甚至不存在的節點類型的子樹,打印出樹,然后重新解析以重建樹使用語法的解析類型。只有在使用語義分析進行解析非常慢時才有意義。所以,你應該仔細考慮這個問題。
然而,編寫一個不考慮間距或注釋等“頻道外”內容的粗略序列化器/反序列化器并不困難。這個 C# 程序(您可以將其改編為 python)是一個使用grammars-v4/sexpression.g4語法為目標語法arithmetic.g4重建樹的示例。使用toStringTree(rule-names)
,樹首先被序列化為一個字符串。(請注意,toStringTree()
沒有解析器規則名稱很難閱讀,這就是我問的原因。)然后,解析 s 表達式并使用 Antlr 訪問器執行自下而上的重建。自從toStringTree()
沒有用標記的類型標記解析樹葉子(例如,區分數字和符號),字符串被詞法化以重建值。它還使用反射來創建正確的解析樹節點類型。
為解析樹輸出點圖也很容易,我將其包含在程序中,使用自上而下的遞歸訪問器。在這里,遞歸函數將每條邊輸出到特定節點的子節點。由于每個節點名稱必須是唯一的(它是一棵樹),因此我將節點的預購樹編號添加到名稱中。
--肯
添加回答
舉報