給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。
如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。
容易改變和擴充套件文法,因為該模式使用類來表示文法規則,你可使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。
直譯器模式為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常複雜時,使用其他的技術如語法分析或編譯器生成器來處理。
實現乙個簡單的**直譯器。規則大致有:「c d e f g a b」分別表示「do-re-mi-fa-so-la-ti」;音符長度1表示一拍,2表示二拍,0.5表示半拍,0.25表示四分之一拍,以此類推。解釋以下《上海灘》
* 演奏內容類
* created by callmedevil on 2019/12/15.
*/public class playcontext
/**
* 表示式類
* created by callmedevil on 2019/12/15.
*/public abstract class expression else
}// 抽象方法執行,不同的文法的子類,有不同的執行處理
public abstract void excute(string key ,double value);
}
/**
* 音符類
* created by callmedevil on 2019/12/15.
*/public class note extends expression
system.out.print(note + " ");}}
/**
* 音階類
* created by callmedevil on 2019/12/15.
*/public class scale extends expression
system.out.print(scale + " ");}}
public class test
expression.interpret(context);
}} catch (exception e) }}
執行結果
上海灘:
中音 3 6 3 5 2 3 5 6 高音 1 中音 6 5 1 3 2
增加乙個文法,就是演奏速度,用「t」表示,毫秒為單位,『t 1000』表示每節拍一秒。
/**
* 音速類
* created by callmedevil on 2019/12/15.
*/public class speed extends expression else if (value >= 1000) else
system.out.print(speed + " ");}}
public class test
expression.interpret(context);
}} catch (exception e) }}
執行結果
上海灘:
中速 中音 3 6 3 5 2 3 5 6 高音 1 中音 6 5 1 3 2
設計模式(C 實現)(二十四) 直譯器模式
編寫示例程式,解析json格式資料。像我們程式設計師日常使用的json解析 正規表示式 更甚者編譯器編譯 這些其實都是一種制定了規則,將一些符號進行翻譯,解釋成特定的功能,其實這些都用了直譯器模式的思想。json資料示例 interpreter.h 在該檔案中,實現了解析基類iinterpreter...
大話設計模式二十四 職責鏈模式(加薪非要老總批 )
職責連模式 使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係,將多個物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。管理者 public abstract class manager public void setsuperior manager superio...
大話設計模式二十四 職責鏈模式(加薪非要老總批 )
職責連模式 使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係,將多個物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。管理者 public abstract class manager public void setsuperior manager superio...