2015-06-19 56 views
3

我使用升壓精神的序列,例如BOOST SPIRIT解析 - 創建正確的AST樹

t1 JOIN t2 JOIN t3 JOIN ... JOIN tn 

分析和結果應該是AST樹與語義

((...((t1 JOIN t2) JOIN t3) JOIN ...) JOIN tn) 

我試圖用規則如:

source = singleTable | (source >> JOIN >> singleTable); 

但是,根據Boost Spirit設計,解析過程僅使用規則a的第一部分nd僅解析表達式中的第一項(「t1」),並將剩餘的序列解析爲不連續(「JOIN t2 JOIN t3 JOIN ... JOIN tn」)。

哪個是解決這個問題的最好方法?

我可以重寫喜歡

source = (singleTable >> JOIN >> source) | singleTable; 

但在這種情況下,規則的創建AST的樣子

(t1 JOIN (t2 JOIN (t3 JOIN (... JOIN tn)...))). 

所以我需要補充處理步驟,以獲得AST所需表格。

解析後是否有其他方法提供正確的AST?

回答

1

* Aside數據庫引擎不會像這樣盲目地創建它們的AST。更可能的是,他們可能會創建一個無序的行源列表((連接到)表/視圖),並讓查詢優化器計算出如何優化計劃執行。

除非您的實際AST的一個更好的例子,下面是更接近一個規則:

singleTable >> - ("JOIN" >> source) 
相關問題