從這張結構圖中可以看到,Sql語句可能出現(xiàn)非常復雜的組合結構,假如不使用語法樹表示,很難實現(xiàn)不同數(shù)據(jù)庫平臺的轉換。 2. COMPOSITE(組合)—對象結構型模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。C o m p o s i t e使得用戶對單個對象和組合對象的使用具有一致性。
從上面的Sql語句的語法結構可以看到一個查詢語句可能是很簡單的select * from ATable,也可能在sql里面又包含其他的Sql語句。按照組合優(yōu)先于繼續(xù)的規(guī)則,并沒有給單獨的Sql和復合的Sql語句創(chuàng)建不同的類,而是在內部組合并遞歸引用自己的定義,對訪問語法樹的客戶代碼來說,并不需要了解所訪問的Sql語句是否存在復合結構。3. VISITOR(訪問者)—對象行為型模式:表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。 前面已經通過解釋器模式解析Sql語法,用組合模式來存儲解析的語法樹,但是我們所需要的不僅如此。還要按照SqlServer的語法結構把語法樹上的各個節(jié)點重新組合,最終輸出SqlServer上可以執(zhí)行的Sql語句。例如:Oracle中的一句連接查詢select a.*,b.* from a,b where a.id=b.id(+),在SqlServer中對應的語句應該是select a.*,b.* from a left join b on a.id=b.id。 從這個簡單的例子中可以看到對于表的左連接或右連接,兩種數(shù)據(jù)庫的語法結構存在較大的差異。假如是在TSql類中寫某個方法,由這個方法遍歷語法樹上的每個節(jié)點,并按照SqlServer的語法結構組合所需要的結果,是可以達到這個目的的。可是假如需要從這棵語法樹導出其它數(shù)據(jù)庫上如sybase可執(zhí)行的sql語句呢,那又要在TSql類中再增加新的遍歷算法,所有的相關代碼又要重新編譯。 通過采用訪問者模式,把遍歷節(jié)點時組合語法樹節(jié)點的算法封裝再訪問者的方法中,如SqlServer的語法就是一個TSqlServerVisitor類,語法樹遍歷每個節(jié)點時,都會調用它的Visit方法,全部訪問完后即可通過GetSql得到所需要的Sql語句。這時假如我們需要轉換到Sybase,只需要再實現(xiàn)一個TSybaseVisitor類,并傳給語法樹,就可以得到sybase的sql語句了。 4.有限狀態(tài)機--單詞和要害字的識別.在解析一句sql語句前,先要把其中的字符、數(shù)字、要害字和函數(shù)等語法元素識別出來。這顯然不能簡單的用字符定位等來判定,而必須用狀態(tài)機來識別不同的規(guī)則表達式。這方面現(xiàn)在c#里的規(guī)則表達式就很好用了。不過經過重寫這些模式識別,也把以前學的編譯原理好好復習了一遍,對有些概念的理解更深入一些,只怪當初學的還不夠精啊。呵呵。