設計模式(11) 直譯器模式

2021-10-07 06:22:18 字數 2679 閱讀 9863

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

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

就比如正規表示式,它就是直譯器模型的一種應用,直譯器為正規表示式定義了乙個文法,如何表示乙個特定的正規表示式,以及如何解釋這個正規表示式。

2.1、當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹,可以使用直譯器模式。而當存在以下情況時該模式效果最好

2.2、該文法的類層次結構變得龐大而無法管理。此時語法分析程式生成器這樣的工具是最好的選擇。他們無需構建抽象語法樹即可解釋表示式,這樣可以節省空間而且還可能節省時間。

2.3、效率不是乙個關鍵問題,最高效的直譯器通常不是通過直接解釋語法分析樹實現的,而是首先將他們裝換成另一種形式,例如,正規表示式通常被裝換成狀態機,即使在這種情況下,轉換器仍可用直譯器模式實現,該模式仍是有用的。

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

3.1.2、也比較容易實現方法, 因為定義抽象語法樹總各個節點的類的實現大體類似, 這些類都易於直接編寫。

3.1.3、直譯器模式就是將一句話,轉變為實際的命令程式執行而已。 而不用直譯器模式本身也可以分析, 但通過繼承抽象表示式的方式, 由於依賴轉置原則, 使得文法的擴充套件和維護都帶來的方便。

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

* desc: 抽象表示式是生成語法集合(語法樹)的關鍵,每個語法集合完成指定語法解析任務,

* 它是通過遞迴呼叫的方式,最終由最小的語法單元進行解析完成。

* * @author [email protected]

* @version 1.0

* @date 2020/06/15 10:01

*/public abstract class abstractexpression

/**

* desc: 條件驗證,驗證表示式

* * @author [email protected]

* @version 1.0

* @date 2020/06/15 10:02

*/public class terminalexpression extends abstractexpression

/*** 驗證表示式是否包含指定字串

* @param context 表示式

* @return true or false

*/@override

public boolean interpret(string context) else

}}

/**

* desc: and條件表示式

* * @author [email protected]

* @version 1.0

* @date 2020/06/15 10:47

*/public class andexpression extends abstractexpression

@override

public boolean interpret(string context)

}

/**

* desc: 或條件表示式

* * @author [email protected]

* @version 1.0

* @date 2020/06/15 10:45

*/public class orexpression extends abstractexpression

@override

public boolean interpret(string context)

}

/**

* desc: 測試

* * @author [email protected]

* @version 1.0

* @date 2020/06/15 10:31

*/public class clienttest

//規則:妲己 是乙個已婚的女性

public static abstractexpression getmarredexpression()

public static void main(string args)

}

小明是男性:true

李四是男性:false

妲己是已婚女性:true

武則天是已婚女性:false

設計模式 直譯器模式

未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...

設計模式 直譯器模式

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

設計模式 直譯器模式

直譯器模式 interpreter pattern 提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。...