21 直譯器模式

2021-09-29 18:18:05 字數 2227 閱讀 5762

一、直譯器模式

直譯器模式定義如下:給定一種語言,定義它的文法表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。典型的直譯器模式中會有終結符和非終結符之說,語法也根據兩種終結符,決定語句最終含義。

模擬吉他示例:

要開發乙個自動識別譜子的結他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外(假設已完成),最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分:根據規則翻譯譜的內容;根據翻譯的內容演奏。我們用乙個直譯器模型來完成這個功能。

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上下左右方...