設計模式之直譯器模式

2021-10-04 10:23:43 字數 2859 閱讀 1238

直譯器模式(interpreter pattern) 是指給定一門語言, 定義它的語法的一種表示, 並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。是一種按照規定的語法進行解析的模式,屬於行為型模式。

就比如編譯器可以將原始碼編譯解釋為機器碼, 讓cpu能進行識別並執行。直譯器模式的作用其實與編譯器一樣,都是將一些固定的語法進行解釋,構建出乙個解釋句子的直譯器。簡單理解,直譯器是乙個簡單語法分析工具,它可以識別句子語義,分離終結符號和非

終結符號,提取出需要的資訊,讓我們能針對不同的資訊做出相應的處理。其核心思想是識別語法,構建解釋。

其實我們每天都生活在直譯器模式中,我們平時所聽到的**都可以通過簡譜記錄下來;還有戰爭年代發明的摩爾斯電碼(又譯為摩斯密碼, morsecode) , 其實也是一種直譯器。我們的程式中,如果存在一種特定型別的問題,該型別問題涉及多個不同例項,但是具備固定語法描述,那麼可以使用直譯器模式對該型別問題進行解釋,分離出需要的資訊,根據獲取的資訊做出相應的處理。簡而言之,對於一些固定語法構建乙個解釋句子的直譯器。直譯器模式適用於以下應用場景:

抽象表示式(expression) :負責定義乙個解釋方法interpret, 交由具體子類進行具體解釋;

終結符表示式(terminal expression) :實現文法中與終結符有關的解釋操作。文法中的每乙個終結符都有乙個具體終結表示式與之相對應,比如公式r=r1+r2,r1和r2就是終結符,對應的解析r1和r2的直譯器就是終結符表示式。通常乙個直譯器模式中只有乙個終結符表示式,但有多個例項,對應不同的終結符(r1,r2);

非終結符表示式(nonterminal expression) :實現文法中與非終結符有關的解釋操作。文法中的每條規則都對應於乙個非終結符表示式。非終結符表示式一般是文法中的運算子或者其他關鍵字,比如公式r=r1+r2中, 「+」就是非終結符,解析「+」的直譯器就是乙個非終結符表示式。非終結符表示式根據邏輯的複雜程度而增加,原則上每個文法規則都對應乙個非終結符表示式;

上下文環境類(context) :包含直譯器之外的全域性資訊。它的任務一般是用來存放文法中各個終結符所對應的具體值,比如r=r1+r2,給r1賦值100,給r2賦值200,這些資訊需要存放到環境中。

下面我們用直譯器模式來實現乙個數學表示式計算器,包含加減乘除運算。首先定義抽象表示式角色iarithmeticinterpreter介面:

public

inte***ce

iarithmeticinterpreter

建立終結表示式角色abstractinterpreter抽象類:

public

abstract

class

abstractinterpreter implements iarithmeticinterpreter

}

分別建立非終結表示式角色加、減、乘、除直譯器:

//

加public

class

addinterpreter extends abstractinterpreter

public

intinterpret() }//

減public

class

subinterpreter extends abstractinterpreter

public

intinterpret() }//

乘public

class

multiinterpreter extends abstractinterpreter

public

intinterpret() }//

除public

class

divinterpreter extends abstractinterpreter

public

intinterpret()

}

建立數字表示式類:

public

class

numinterpreter implements iarithmeticinterpreter

public

intinterpret()

}

建立計算器類:不在乎乘除與加減得順序,這都是直譯器按照語義得解釋,本案例中按照順序執行

public

class

calculator

private

void

parse(string expression)

else}}

public

intcalculate()

}

操作工具類:

public

class

operatorutil

public

static

abstractinterpreter getinterpreter(iarithmeticinterpreter left, iarithmeticinterpreter right, string symbol)

else

if (symbol.equals("-"

))

else

if (symbol.equals("*"

))

else

if (symbol.equals("/"

))

return

null

; }

}

測試類:

public

class

test

}

優點:

缺點:

設計模式之直譯器模式

直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。使用場景 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙...

設計模式之直譯器模式

直譯器模式 1.直譯器模式 給定乙個語言,定義它文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。比如 在字串中...

設計模式之直譯器模式

解析器模式是一種行為型設計模式。其思想是 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。解析器模式涉及4個角色 結構圖 於網路 下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a b c,然後要求使用者輸入每個變數的具體值,如...