天天看點

Calcite(二): 從list到tree的轉換1

  文法解析有個核心目标,那就是需要建構抽象文法樹。雖然說文法解析架構可以很容易的識别出各節點的結構,但還需要我們按照自行需求,轉換成期望的樹結構,才能夠友善使用。

  基本上,所有的表達式,都會進行嵌套組合,進而才能夠發揮其強大的作用。但,往往我們在做解析的時候,又是線性的解析。是以,最初,我們能得到的必然是一個個token清單。是以,如何将一個個平鋪的清單,轉換成樹狀結構,将會是一個比較重要的話題。我們今天就來看看calcite中的其中一非常小的點,它是如何将一個list轉換為tree的吧。

  calcite 樹的轉化過程: list -> tree,是一個相對獨立的過程,是以被寫到工具類中去了。其最終結果是用 SqlNode 承載的。

  以上就是其轉換list到tree的架構代碼了,關鍵詞是:優先級,轉換,。。。

  樹的轉換過程,主要是将list進行合并組合的過程。大體是按照每個符号的優先級,将其前後元素作為其操作數,合并。比如:a > 1 or b < 2, 會被建構 >a1 or b < 2, >a1 or <b2, (or)(>a1)(<b2) 。  而要選出優先級最高的元素,優先從其開始做樹合并,才是正确的選擇。确定最高優先級元素過程示意圖如下:

Calcite(二): 從list到tree的轉換1

   具體解析過程如下:

  

  符号定義時,就将優先級定義好了。以便在後續建構時使用。其基本都被定義在 SqlStdOperator 中。 以加減乘除為例,加減會是同一個優先級,乘除是另一個高優先級的操作。

   最終的樹形結果示例如下:

Calcite(二): 從list到tree的轉換1

  即由操作數和操作符組成的樹結構,即可認為它是一種基于棧的編譯結構,對于我們表達語義,比較清晰。

  實際上,樹結構隻是一種表現形式,它需要在不同的場合應用不同的結構,靈活變換,方能如魚得水。比如整個sql語句,在calcite的樹結構中,又不是這樣的了。

Calcite(二): 從list到tree的轉換1

不要害怕今日的苦,你要相信明天,更苦!