我用Flex & Bison生成一個決議器。該分析器作業得很好。它生成了一個XML檔案。它有這樣的規則:
monthdatetime: TWODIGITS TWODIGITS TWODIGITS 時區 { $$ = concat(10, "<MonthNumeric>", 1, "</MonthNumeric>< Day>", 2, "</Day><HourTime>", 3, "</HourTime><MinuteTime>", 4, "</MinuteTime>", 5); }
現在我想用構建抽象語法樹(AST)的動作來代替這些動作。開始規則的動作將是呼叫一個 "序列化 "函式,該函式將瀏覽 AST,從而一舉生成 XML。
這就是我的計劃。
在我上面展示的規則中,右側有 5 個專案。有些規則的專案甚至更多。Eeek! 我是否應該設計AST以支持具有任意數量分支的節點(N-ary節點)?
{ $$ = new_ast("field", $1, $2, $3, $4, $5); }
這是個好方法嗎?或者,我應該重新設計我的規則,使每個規則的右側最多包含兩個專案?這樣的話,我就可以創建一個二進制樹的AST了。
您有什么建議?在設計決議器規則時,對于規則右側的專案數量是否有一個最佳實踐?是創建一個二叉樹的AST好呢,還是創建一個N-ary樹的AST好呢?
uj5u.com熱心網友回復:
這是關于計算機科學。任何樹狀結構(有n個分支)都可以用來表示所有其他有m個分支的樹。
如果m小于n,則是微不足道的,因為null被用來填入n-m個子項。當n等于m時,也沒有什么問題。
你問的是當m大于n時該怎么做。很簡單,讓它們成為子樹,這很容易做到。
{$$ = new_ast("field",1,2,3,4, new_ast("child",5,6,7,8,9)); }
現在你將來的樹行將知道這是一個較長的節點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/332985.html
標籤:
上一篇:在Ubuntu18.04上安裝GNUm41.4.19
下一篇:WXPython事件處理-按鈕
