1. 程式人生 > >python-解釋器模式

python-解釋器模式

字段 出現 分享圖片 模擬 大致 字符串 實例 模型 打印

說明:

解釋器模式在面向對象語言實現的編譯器中得到了廣泛的應用。但是此模式進適用於建大的文法解釋,弊端又多,所以很少有其他方面使用。例如:將“1+2+3-4”等字符串輸入到python的console,但是本身python不認識這些字符串,就需要定義的一套文法規則來解釋這些字符串,也就是設計一個自定義語言。

解釋器模式:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。在解釋器模式的定義中所指的“語言”是使用規定格式和語法的代碼。

技術分享圖片

解釋器模式的結構

解釋器模式包含以下4個角色: AbstractExpression(抽象表達式) TerminalExpression(終結符表達式) NonterminalExpression(非終結符表達式) Context(環境類)

實例:

#要開發一個自動識別譜子的吉他模擬器,達到錄入譜即可按照譜發聲的效果。
# 除了發聲設備外(假設已完成),最重要的就是讀譜和譯譜能力了。
# 分析其需求,整個過程大致上分可以分為兩部分:
# 根據規則翻譯譜的內容;根據翻譯的內容演奏。
# 我們用一個解釋器模型來完成這個功能。
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=0 for ele in play_seg: if ele.isalpha():#檢驗字符串是否只由字母組成 pos+=1 continue break play_chord
= play_seg[0:pos] play_value = play_seg[pos:] self.execute(play_chord,play_value) def execute(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

模式優點

易於改變和擴展文法 可以方便地實現一個簡單的語言 實現文法較為容易(有自動生成工具) 增加新的解釋表達式較為方便

模式缺點

對於復雜文法難以維護 執行效率較低

模式適用環境

可以將一個需要解釋執行的語言中的句子表示為一棵抽象語法樹 一些重復出現的問題可以用一種簡單的語言來進行表達 一個語言的文法較為簡單 執行效率不是關鍵問題

python-解釋器模式