1、寫在前面
這個模式是特意放在最後才寫出來,因為我看了3遍也沒有完全理解這個模式的含義,這裡只能是暫時按照書中的定義挪過來了。其實可以粗略的說像ie等瀏覽器其實也是在解釋html文法,將客戶端傳來的html標記文字轉換成相應的網頁格式展示給使用者(當然,瀏覽器程式自身還有很多其他複雜的邏輯,這裡只是做乙個大概的模擬來理解一下直譯器程式)。
2、定義
3、優缺點及適用處
優點:很容易的改變和擴充套件文法,因為直譯器模式使用類來表示文法規則,你可以使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。
缺點:直譯器模式為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。所以建議,當文法非常複雜時,使用其他的技術如語法分析程式、編譯器生成器來處理。
直譯器模式需要解決的是這樣一類問題:如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項標書為乙個簡單語言中的乙個句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。舉例來說:針對機械人,如果讓他走一段路還需要呼叫向前、左轉、右轉的方法就太不合適了,應該可以直接對它說「向前走10步,然後左轉,在向右走5步」,而直譯器模式在這裡就是將這樣的一句話轉變成實際的命令程式執行而已。
從淺顯的層面來說,用直譯器模式就相當於你開發了乙個程式語言或指令碼給自己或別人用。也就是說,直譯器模式就是用『迷你語言』來表現程式需要解決的問題,以迷你語言寫成『迷你程式』來表現具體的問題。
4、例項**
這裡以乙個模擬**直譯器的**來作為例項,具體如下,定義一套規則:
* o表示音階:『o1』表示低音階,『o2』表示中音階,『o3』表示高音階;
* p表示休止符,『c d e f g a b』表示『do-re-mi-fa-so-la-ti』;
* 音符長度:1表示一拍,2表示二拍,0.5表示半拍,0.25表示四分之一拍,以此類推
* 注意:所有的字母和數字之間都要用半形空格分開。
* 例如:上海灘的第一句,「浪奔」可以寫成[o 2 e 0.5 g 0.5 a 3],表示中音開始,演奏的是mi so la
首先,定義乙個演奏內容類,儲存獲取的文法:
///view code///演奏內容類
/// class
playcontext
set }}
其次,定義表示式類,負責解釋每個文法的具體含義,並執行解釋後的文法:
///然後,定義具體的表示式類,這些具體表示式繼承自表示式抽象類:///表示式類
/// abstract
class
expression
}//演奏
public
abstract
void excute(string pkey,double
pvalue);
}
///view code///音符類
/// class
note:expression
console.write("
",lcnote);}}
//////
音階類
/// class
scale : expression
console.write("
",lcscale);}}
最後,在客戶端寫入一句文法,然後解釋並執行:
class5、結束語program
//解釋具體文法,並在內部執行解釋結果
lcexpression.interpret(lccontext);}}
catch
(exception error)
console.readkey();}}
上面是乙個最簡化的解釋模式例項,當然也並沒有把解釋模式完全表現出來,因為在上面的例子中只有終結符表示式,而沒有非終結符表示式的子類,所以如果想真正理解直譯器模式,還需要去研究其他例子。另外,這個模式我在抄完這些**後其實也沒有完全理解,因為確實沒有在實際中碰到使用這個模式的具體**,所以暫時只能這麼淺顯的理解一下這個模式。功夫還是沒下到啊……
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...
直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...