直譯器模式

2022-01-24 02:08:16 字數 2098 閱讀 3407

定義:

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。

如同開發了乙個程式語言會指令碼給自己、別人用。

就是用『迷你語言』來表現程式要解決的問題,用迷你語言寫成『迷你程式』來表現具體的問題。

針對問題:

一種特定型別的問題發生的頻率足夠高,就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。

當有乙個語言需要解釋執行,並且可將該語言中的句子表示為乙個抽象語法樹。

例如:1.正規表示式,用於搜尋匹配的字元;或,判斷乙個字元是否符合規定的格式。

這些需求都非常類似,與其為每乙個特定的需求都寫乙個演算法函式,不如使用一種通用的搜尋演算法來解釋執行乙個正規表示式,該正規表示式定義了帶匹配字串的集合。

直譯器為正規表示式定義了乙個文法:如何表示乙個特定的正規表示式,如何解釋這個正規表示式。

2.ie、firefox……瀏覽器也在解釋html文法,將html標記文字轉換成網頁格式顯示給使用者。

3.其他。只要是可以用語言來描述的,都可應用直譯器模式。人工智慧,機械人……

優點:

很容易地改變、擴充套件文法。因為該模式使用類來表示文法規則,可使用繼承來改變或擴充套件改文法。

比較容易實現文法。以為定義抽象語法樹中各個節點的類的實現答題類似,這些類都易於直接編寫。

通過繼承抽象表示式的方式,由於依賴倒轉沿著,使文法的擴充套件、維護更加方便。

缺點:

為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理、維護。

tip:

建議當文法非常複雜時,使用其他的技術,如:語法分析程式、編譯器生成器來處理。

結構圖:

terminalexpression:實現抽象表示式中所要求的介面,主要是乙個interpret()。文法中每乙個終結符都有乙個具體終結表示式與之相對應。

nonterminalexpression:通過實現抽象表示式的interpret()實現解釋操作。解釋操作以遞迴方式呼叫代表r1、r2、r3……rn中各個符號的例項變數。

客戶端:構建表示該文法定義的語言中乙個特定的句子的抽象語法樹。呼叫解釋操作。

結果:示例:

**直譯器

如果需要增加乙個文法時。如,新增演奏速度……,只需新增乙個速度類。客戶端新增case即可。但是改動了客戶端。

優化:在客戶端那裡應用:簡單工廠+反射

直譯器模式

include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...

直譯器模式

1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...

直譯器模式

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...