學習設計模式之直譯器模式

2022-09-01 16:24:16 字數 1683 閱讀 4317

直譯器模式

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

類結構圖

包含解釋之外的一些全域性資訊。

abstractexpression

宣告乙個抽象的解釋操作,這個介面為抽象語法樹中所有的節點所共享。

terminalexpression

終結符表示式,實現與文法中的終結符相關聯的解釋操作。

nonterminalexpression

非終結符表示式,為文法中的非終結符實現解釋操作。

**示例

樂譜大家都見過,那麼我們來自定義一下 o 表示音階、c d e f g a b 表示 do-re-mi-fa-so-la-ti。

public class context 

public void setplaytext(string playtext)

}public abstract class expression

// 解析的字串例如 o 3 e 0.5

string playkey = context.getplaytext().substring(0, 1);

context.setplaytext(context.getplaytext().substring(2));

string value = context.getplaytext().substring(0, context.getplaytext().indexof(" "));

context.setplaytext(context.getplaytext().substring(context.getplaytext().indexof(" ") + 1));

excute(playkey, value);

}}public class note extends expression

system.out.print(note + "\t");

}}public class scale extends expression

system.out.print(scale + "\t");}}

客戶端示例

public class expressionclient 

expression.interpret(context);}}

}

執行結果

中音	3	5	6	3	5	2	3	5	6	高音	1	中音	6	5	1	3	3	

process finished with exit code 0

優點可以比較方便的修改和擴充套件語法規則。

缺點

幾乎針對每乙個規則都定義了乙個類,所以如果乙個語法的規則比較多,那對於語法的維護工作也會變得非常困難。

學習札記 設計模式之直譯器模式

給定乙個語言,定義文法表示,並定義乙個直譯器去解釋定義的句子。直譯器模式,主要有抽象的直譯器,終結表示式,非終結表示式和上下文。如果按輸入字串得到結果的計算器來理解,抽象的直譯器定義任務也就是得到的結果,終結表示式表達的是字元對應的數字的解釋操作,一般只有乙個,而非終結的表示式有點像各種各樣的符號計...

設計模式之直譯器模式

直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。使用場景 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙...

設計模式之直譯器模式

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