一、直譯器模式
直譯器模式定義如下:給定一種語言,定義它的文法表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。典型的直譯器模式中會有終結符和非終結符之說,語法也根據兩種終結符,決定語句最終含義。
模擬吉他示例:
要開發乙個自動識別譜子的結他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外(假設已完成),最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分:根據規則翻譯譜的內容;根據翻譯的內容演奏。我們用乙個直譯器模型來完成這個功能。
class
playcontext()
: play_text =
none
class
expression()
:def
interpret
(self, context):if
len(context.play_text)==0
:return
else
: play_segs=context.play_text.split(
" ")
for play_seg in play_segs:
pos=
0for ele in play_seg:
if ele.isalpha():
pos+=
1continue
break
play_chord = play_seg[
0:pos]
play_value = play_seg[pos:
] self.execute(play_chord,play_value)
defexecute
(self,play_key,play_value)
:pass
class
normguitar
(expression)
:def
execute
(self, key, value)
:print
"normal guitar playing--chord:%s play tune:%s"
%(key,value)
playcontext
類為譜的內容,這裡僅含乙個字段,沒有方法。expression
即表示式,裡面僅含兩個方法,interpret
負責轉譯譜,execute
則負責演奏;normguitar
類覆寫execute
,以結他的方式演奏。
業務場景如下:
if __name__==
"__main__"
: context = playcontext(
) context.play_text =
"c53231323 em43231323 f43231323 g63231323"
guitar=normguitar(
) guitar.interpret(context)
列印如下:
normal guitar playing-
-chord:c play tune:
53231323
normal guitar playing-
-chord:em play tune:
43231323
normal guitar playing-
-chord:f play tune:
43231323
normal guitar playing-
-chord:g play tune:
63231323
二、直譯器模式的優點和應用場景
優點:1、在語法分析的場景中,具有比較好的擴充套件性。規則修改和制訂比較靈活。
應用場景:
1、若乙個問題重**生,可以考慮使用直譯器模式。這點在資料處理和日誌處理過程中使用較多,當資料的需求方需要將資料納為己用時,必須將資料「翻譯」成本系統的資料規格;同樣的道理,日誌分析平台也需要根據不同的日誌格式翻譯成統一的「語言」。
2、特定語法直譯器。如各種解釋型語言的直譯器,再比如自然語言中基於語法的文字分析等。
三、直譯器模式的缺點
1、解釋規則多樣化會導致直譯器的**;
2、直譯器目標比較單一,行為模式比較固定,因而重要的模組中盡量不要使用直譯器模式。
設計模式21 直譯器模式
直譯器模式 是一種按照規定語法進行解析的方案,在現在專案中使用較少。給定一門語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。優點 最顯著的優點是擴充套件性。缺點 1 直譯器模式會引起類膨脹 2 直譯器模式採用遞迴呼叫方法 3 效率問題。使用場景 1 重 生的問題...
C語言和設計模式(直譯器模式)21
直譯器模式雖然聽上去有些費解,但是如果用示例說明一下就不難理解了。我們知道在c語言中,關於變數的定義是這樣的 乙個不以數字開始的由字母 數字和下劃線構成的字串。這種形式的表示式可以用狀態自動機解決,當然也可以用直譯器的方式解決。cpp view plain copy print typedef st...
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...