上一章已經初步介紹了解釋器模式
這一章將 通過模式的 適用環境 ,解決方案,解決問題 ,模式應用實例來進一步介紹解釋其模式
模式定義:
解釋器模式(Interpreter Pattern) :定義語言的文法,並且建立一個解釋器來解釋該語言中的句子,這里的“語言”意思是使用規定格式和語法的代碼,它是一種類行為型模式。
適用環境:
在以下情況下可以使用解釋器模式:
可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹。
一些重復出現的問題可以用一種簡單的語言來進行表達。
文法較為簡單。
效率不是關鍵問題。
一些重復發生的事情包含固定的一系列操作類型,比較適合用解釋器模式來實現。如果一種特定類型的問題發生的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子.這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題.
模式結構
模式結構
解釋器模式包含如下角色:
Abstract Expression: 抽象表達式
Terminal Expression: 終結符表達式
Nonterminal Expression: 非終結符表達式
Context: 環境類
Client: 客戶類
模式分析
解釋器模式描述了如何為簡單的語言定義一個文法,如何在該語言中表示一個句子,以及如何解釋這些句子。
解決問題:
比如加減乘除四則運算,但是公式每次都不同,比如可配置,有時是a + b - c x d,有時是a x b + c - d,等等個,公式千變萬化,但是都是由加減乘除四個非終結符來連接的,這時我們就可以使用解釋器模式。
解決方案:
文法規則
文法規則實例:
expression ::= value | symbol
symbol ::= expression '+' expression | expression '-' expression
value ::= an integer //一個整數值
在文法規則定義中可以使用一些符號來表示不同的含義,如使用“|”表示或,使用“{”和“}”表示組合,使用“*”表示出現0次或多次等,其中使用頻率最高的符號是表示或關系的“|” 。
抽象語法樹:
除了使用文法規則來定義一個語言,在解釋器模式中還可以通過一種稱之為抽象語法樹(Abstract Syntax Tree, AST)的圖形方式來直觀地表示語言的構成,每一棵抽象語法樹對應一個語言實例。
模式分析
抽象語法樹描述了如何構成一個復雜的句子,通過對抽象語法樹的分析,可以識別出語言中的終結符和非終結符類。
在解釋器模式中,每一種終結符和非終結符都有一個具體類與之對應,正因為使用類來表示每一個語法規則,使得系統具有較好的擴展性和靈活性。
模式優缺點
解釋器模式的優點
易於改變和擴展文法。
易於實現文法。
增加了新的解釋表達式的方式。
解釋器模式的缺點
對於復雜文法難以維護。
執行效率較低。
應用場景很有限。
模式應用實例
(1) 解釋器模式在使用面向對象語言實現的編譯器中得到了廣泛的應用,如Smalltalk語言的編譯器。
(2) 目前有一些基於Java抽象語法樹的源代碼處理工具,如在Eclipse中就提供了Eclipse AST,它是Eclipse JDT的一個重要組成部分,用來表示Java語言的語法結構,用戶可以通過擴展其功能,創建自己的文法規則。
(3) 可以使用解釋器模式,通過C++、Java、C#等面向對象語言開發簡單的編譯器,如數學表達式解析器、正則表達式解析器等,用於增強這些語言的功能,使之增加一些新的文法規則,用於解釋一些特定類型的語句。