直譯器模式(interpreter),給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。
直譯器模式需要解決的問題是,如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。
直譯器模式uml類圖:
如上圖所示:abstractexpression(抽象表示式),宣告乙個抽象的解釋操作,這個介面為抽象語法樹中所有的節點所共享;terminalexpression(終結符表示式),實現與文法中的終結符相關聯的解釋操作,實現抽象表示式中所要求的介面,主要是乙個interpret()方法,文法中每乙個終結符都有乙個具體終結表示式與之相對應;nonterminalexpression(非終結符表示式),為文法中的非終結符實現解釋操作。對文法中每一條規則r1,r2......rn都需要乙個具體的非終結符表示式類。通過實現抽象表示式的interpret()方法實現解釋操作。解釋操作以遞迴形式呼叫上面所提到的代表r1,r2......rn中各個符號的例項變數;context,包含直譯器之外的一些全域性資訊;客戶端**,構建表示該文法定義的語言中乙個特定的句子的抽象語法樹。
直譯器模式實現:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace interpreter
/*terminalexpression(終結符表示式),實現與文法中的終結符相關聯的解釋操作,實現抽象表示式中所要求的
介面,主要是乙個interpret()方法,文法中每乙個終結符都有乙個具體終結表示式與之相對應。*/
class terminalexpression : abstractexpression
}/*nonterminalexpression(非終結符表示式),為文法中的非終結符實現解釋操作。對文法中每一條規則r1,r2......rn
都需要乙個具體的非終結符表示式類。通過實現抽象表示式的interpret()方法實現解釋操作。解釋操作以遞迴形式
呼叫上面所提到的代表r1,r2......rn中各個符號的例項變數。*/
class nonterminalexpression : abstractexpression
}/*context,包含直譯器之外的一些全域性資訊*/
class context
set
}private string output;
public string output
set }}
}
客戶端:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace interpreter
console.read();}}
}
直譯器模式總結:通常當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。
使用了直譯器模式,就意味著可以很容易的改變和擴充套件文法,因為該模式使用類來表示文法規則,你可以使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編碼。
但是使用直譯器模式也有不足,直譯器模式為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常複雜時,使用其它的技術如語法分析程式或編譯器生成器來處理。
設計模式之直譯器模式(Interpreter)
直譯器模式是我們暫時的最後一講,一般主要應用在oop開發中的編譯器的開發中,所以適用面比較窄。context類是乙個上下文環境類,plus和minus分別是用來計算的實現,如下 public inte ce expression public class plus implements expres...
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...