大話設計模式筆記(二十四) 直譯器模式

2022-05-02 03:09:07 字數 2065 閱讀 6194

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

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

容易改變和擴充套件文法,因為該模式使用類來表示文法規則,你可使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。

直譯器模式為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常複雜時,使用其他的技術如語法分析或編譯器生成器來處理。

實現乙個簡單的**直譯器。規則大致有:「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...