自定義語言的實現——解釋器模式(六) – JAVA編程語言程序開發技術文章

18.6 解釋器模式總結
      解釋器模式為自定義語言的設計和實現提供瞭一種解決方案,它用於定義一組文法規則並通過這組文法規則來解釋語言中的句子。雖然解釋器模式的使用頻率不是特別高,但是它在正則表達式、XML文檔解釋等領域還是得到瞭廣泛使用。與解釋器模式類似,目前還誕生瞭很多基於抽象語法樹的源代碼處理工具,例如Eclipse中的Eclipse AST,它可以用於表示Java語言的語法結構,用戶可以通過擴展其功能,創建自己的文法規則。
      1. 主要優點
      解釋器模式的主要優點如下:
      (1) 易於改變和擴展文法。由於在解釋器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴展文法。
      (2) 每一條文法規則都可以表示為一個類,因此可以方便地實現一個簡單的語言。
      (3) 實現文法較為容易。在抽象語法樹中每一個表達式節點類的實現方式都是相似的,這些類的代碼編寫都不會特別復雜,還可以通過一些工具自動生成節點類代碼。
      (4) 增加新的解釋表達式較為方便。如果用戶需要增加新的解釋表達式隻需要對應增加一個新的終結符表達式或非終結符表達式類,原有表達式類代碼無須修改,符合“開閉原則”。
      2. 主要缺點
      解釋器模式的主要缺點如下:
      (1) 對於復雜文法難以維護。在解釋器模式中,每一條規則至少需要定義一個類,因此如果一個語言包含太多文法規則,類的個數將會急劇增加,導致系統難以管理和維護,此時可以考慮使用語法分析程序等方式來取代解釋器模式。
      (2) 執行效率較低。由於在解釋器模式中使用瞭大量的循環和遞歸調用,因此在解釋較為復雜的句子時其速度很慢,而且代碼的調試過程也比較麻煩。
      3. 適用場景
      在以下情況下可以考慮使用解釋器模式:
      (1) 可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹。
      (2) 一些重復出現的問題可以用一種簡單的語言來進行表達。
      (3) 一個語言的文法較為簡單。
      (4) 執行效率不是關鍵問題。【註:高效的解釋器通常不是通過直接解釋抽象語法樹來實現的,而是需要將它們轉換成其他形式,使用解釋器模式的執行效率並不高。】
 
練習
Sunny軟件公司欲為數據庫備份和同步開發一套簡單的數據庫同步指令,通過指令可以對數據庫中的數據和結構進行備份,例如,輸入指令“COPY VIEW FROM srcDB TO desDB”表示將數據庫srcDB中的所有視圖(View)對象都拷貝至數據庫desDB;輸入指令“MOVE TABLE Student FROM srcDB TO desDB”表示將數據庫srcDB中的Student表移動至數據庫desDB。試使用解釋器模式來設計並實現該數據庫同步指令。
【註:本練習是2010年我在給某公司進行設計模式內訓時該公司正在開發的一個小工具!】
      解釋器模式可以說是所有設計模式中難度較大、使用頻率較低的一個模式,如果您能夠靜下心來把這幾篇文章都看完,我相信您對解釋器模式應該有瞭一個較為全面的瞭解,歡迎大傢與我交流和討論。
      感謝您能夠堅持看完這六篇關於解釋器模式的文章,!
作者:劉偉

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。