1.1概述 給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。這就是解釋器模式的定義。 對於某些問題,我們可能希望用簡單的語言來描述,即希望用簡單的語言來實現一些操作,比如用簡單語言實現簡單的翻譯操作,用戶輸入Teacher drink water,程式 ...
1.1概述
給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。這就是解釋器模式的定義。
對於某些問題,我們可能希望用簡單的語言來描述,即希望用簡單的語言來實現一些操作,比如用簡單語言實現簡單的翻譯操作,用戶輸入Teacher drink water,程式輸出“老師喝水”。學習使用解釋器模式需要用到一些形式語言的知識,和編譯原理課程中相關知識點比較接近,個人覺得編譯原理中相關理論知識比較晦澀,在此處就不繼續往下細究具體原理,有興趣的同學可以去看一看編譯原理的教材。
例如,一個語言一旦有了語句,就可以讓程式根據語句進行某種操作。定義一個簡單語言,如果使用程式實現該語言時,定義的基本操作是將終結符號的值翻譯為漢語,如Teacher翻譯為“老師”、Tiger翻譯為“老虎”,那麼當用戶使用該語言輸入“Teacher drink water”後,程式輸出“老師喝水”。
1.2模式的結構
解釋器模式包括以下四種角色:
(1)抽象表達式(AbstractExpression):該角色是一個介面,負責定義抽象的解釋操作。
(2)終結符表達式(TerminalExpression):實現AbstractExpression介面的類。該類將介面中的解釋操作實現為與文法中的終結符相關聯的操作,即文法中每個終結符號需要一個TerminalExpression類。
(3)非終結符表達式(NonterminalExpression):實現AbstractExpression介面的類。文法中的每一條規則都需要一個NonterminalExpression類。NonterminalExpression類為文法中的非終結符號實現解釋操作,該解釋操作通常使用遞歸調用表示文法規則中的那些對象的解釋操作。
(4)上下文(Context):包含解釋器之外的一些全局信息。
解釋器模式結構的類圖如下圖所示:
圖一:解釋器模式的類圖(PS:類圖畫的不標準,此處僅作參考哦)
1.3解釋器模式的優點
(1)將每一個語法規則表示成一個類,方便於實現簡單的語言。
(2)由於使用類表示語法規則,可以教容易改變或擴展語言的行為。
(3)通過在類結構中加入新的方法,可以在解釋的同時增加新的行為。
1.4適合使用解釋器模式的情景
(1)當有一個簡單的語言需要解釋執行,並且可以將該語言的每一個規則表示為一個類時,就可以使用解釋器模式。