直譯器(interpreter)模式的定義:給分析物件定義乙個語言,並定義該語言的文法表示,再設計乙個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的例項。這種模式實現了文法表示式處理的介面,該介面解釋乙個特定的上下文。
這裡提到的文法和句子的概念同編譯原理中的描述相同,「文法」指語言的語法規則,而「句子」是語言集中的元素。例如,漢語中的句子有很多,「我是中國人」是其中的乙個句子,可以用一棵語法樹來直觀地描述語言中的句子。
優點擴充套件性好。由於在直譯器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴充套件文法。
容易實現。在語法樹中的每個表示式節點類都是相似的,所以實現其文法較為容易。
缺點執行效率較低。直譯器模式中通常使用大量的迴圈和遞迴呼叫,當要解釋的句子較複雜時,其執行速度很慢,且**的除錯過程也比較麻煩。
會引起類膨脹。直譯器模式中的每條規則至少需要定義乙個類,當包含的文法規則很多時,類的個數將急劇增加,導致系統難以管理與維護。
可應用的場景比較少。在軟體開發中,需要定義語言文法的應用例項非常少,所以這種模式很少被使用到。
直譯器模式包含以下主要角色。
抽象表示式(abstract expression)角色:定**釋器的介面,約定直譯器的解釋操作,主要包含解釋方法 interpret()。
終結符表示式(terminal expression)角色:是抽象表示式的子類,用來實現文法中與終結符相關的操作,文法中的每乙個終結符都有乙個具體終結表示式與之相對應。
非終結符表示式(nonterminal expression)角色:也是抽象表示式的子類,用來實現文法中與非終結符相關的操作,文法中的每條規則都對應於乙個非終結符表示式。
環境(context)角色:通常包含各個直譯器需要的資料或是公共的功能,一般用來傳遞被所有直譯器共享的資料,後面的直譯器可以從這裡獲取這些值。
客戶端(client):主要任務是將需要分析的句子或表示式轉換成使用直譯器物件描述的抽象語法樹,然後呼叫直譯器的解釋方法,當然也可以通過環境角色間接訪問直譯器的解釋方法。
1.抽象表示式類
public
inte***ce
expression
2.終結符表示式
public
class
terminalexpression
implements
expression
}@override
public
boolean
interpret
(string info)
return
false;}
}
3.非終結符表示式類
public
class
noexpression
implements
expression
@override
public
boolean
interpret
(string info)
}
4.環境類
文法規則
::= 的
::= 鹿城|溫州
::= 老人|婦女|兒童
這裡的符號「::=」表示「定義為」的意思,用「〈」和「〉」括住的是非終結符,沒有括住的是終結符。
public
class
env;
private string[
] persons=
;private expression cityperson;
public
env(
)public
void
free
(string info)
else
}}
5.測試輸出
public
class
test
}
龍灣的老人,您不是免費人員,本次乘車扣費2元!
鹿城的年輕人,您不是免費人員,本次乘車扣費2元!
您是溫州的婦女,您本次乘車免費!
您是溫州的兒童,您本次乘車免費!
麗水的兒童,您不是免費人員,本次乘車扣費2元!
設計模式 行為型模式 直譯器模式
四則運算問題 通過直譯器模式來實現四則運算,如計算a b c的值,具體要求 1 先輸入表示式的形式,比如 a b c d e,要求表示式的字母不能重複 2 在分別輸入a b,c,d,e 的值 傳統方案解決四則運算問題分析 1 編寫乙個方法,接收表示式的形式,然後根據使用者輸入的數值進行解析,得到結果...
設計模式 行為型模式 直譯器模式
給分析物件定義乙個語言,並定義該語言的文法表示,再設計乙個直譯器來解釋語言中的句子。該模式實現了文法表示式處理的介面,該介面解釋乙個特定的上下文。優點擴充套件性好。由於在直譯器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴充套件文法 容易實現。在語法樹中的每個表示式節點類都是類似...
Java設計模式 行為型模式之直譯器模式
一 前言 直譯器模式,就像我們生活場景中的翻譯一樣,它給定某種語言,並定義它的文法表示,直譯器通過這種標識來對語句進行翻譯。直譯器模式一般很少用於我們的 開發中,不到萬不得已我們是不會考慮 直譯器這種設計模式的。因為這種設計模式應用場景很少,而且需要的類也很多,很容易引起類膨脹,複雜的語法也使得其難...