直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。
定義
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。
使用場景
當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。而當存在以下情況時該模式的效果最好:
1. 該文法簡單對於複雜的文法,文法的類層次變得龐大而無法管理。此時語法分析程式生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表示式,這樣可以節省空間而且還可能節省時間。
2. 效率不是乙個關鍵問題,最高效的直譯器通常不是通過直接解釋語法分析樹實現的,而是首先將它們轉換成另外一種形式。例如,正規表示式通常被轉換成狀態機。但即使在這種情況下,轉換器仍可用直譯器模式實現,該模式仍是有用的。
結構
實現
我們用乙個加減乘除的例子來說明一下直譯器模式,abstractexpression介面設計及其實現
public
abstract
class
abstractexpression
public
class
terminalexpression
extends
abstractexpression
@override
public
intinterpret(context context)
}public
class
addextends
abstractexpression
@override
public
intinterpret(context context)
}public
class
subtract
extends
abstractexpression
@override
public
intinterpret(context context)
}public
class
multiply
extends
abstractexpression
@override
public
intinterpret(context context)
}public
class
division
extends
abstractexpression
@override
public
intinterpret(context context)
}
context的設計與實現
public
class
context
public
intlookupvalue(variable x)
}public
class
variable
extends
abstractexpression
}
我們來測試一下,計算(a*b)/(a-b+2)
public
class
client
}
直譯器模式提供了乙個簡單的方式來執行語法,而且容易修改或者擴充套件語法。一般系統中很多類使用相似的語法,可以使用乙個直譯器來代替為每乙個規則實現乙個直譯器。而且在直譯器中不同的規則是由不同的類來實現的,這樣使得新增乙個新的語法規則變得簡單。直譯器模式用來做各種各樣的直譯器,如正規表示式等的直譯器等等。 設計模式之直譯器模式
直譯器模式 1.直譯器模式 給定乙個語言,定義它文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。比如 在字串中...
設計模式之直譯器模式
解析器模式是一種行為型設計模式。其思想是 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。解析器模式涉及4個角色 結構圖 於網路 下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a b c,然後要求使用者輸入每個變數的具體值,如...
設計模式之直譯器模式
interpreter模式也叫直譯器模式,是行為模式之一,它是一種特殊的設計模式,它建立乙個直譯器,對於特定的計算機程式語言,用來解釋預先定義的文法。簡單地說,interpreter模式是一種簡單的語法直譯器構架。換一種解釋就是定義乙個語法,定義乙個直譯器,該直譯器處理該語法句子將某些複雜問題,表達...