直譯器模式是類的行為模式。
給定乙個語言後,直譯器模式可以定義出其文法的一種表示,
並同時提供乙個直譯器。客戶端可以使用這個直譯器來解釋這個語言中的句子。
語言、直譯器和瀏覽器
直譯器模式只描述直譯器是怎麼工作的,並不指名怎樣在執行時建立新的直譯器。
雖然廣義的將,直譯器不一定要有乙個瀏覽器,但是使用瀏覽器仍然是最常見的建立直譯器的辦法。
乙個瀏覽器可以從乙個檔案或命令列讀入文本性命令,並建立直譯器。
瀏覽器的工作就是將乙個文本性語言翻譯成為等效的直譯器語言。因此,直譯器往往需要瀏覽器。
直譯器模式的結構
模式涉及的角色:
1.抽象表示式角色(expression): 宣告乙個所有的具體表示式角色都需要實現的抽象介面。這個介面主要是乙個 interpret()方法,稱作解釋操作。
2.終結符表示式角色(terminal expression): 這是乙個具體角色。
3.非終結符表示式角色(nonterminal expression): 這是乙個具體角色。
4.客戶端角色(client): 代表模式的客戶端有以下功能:
在一般情況下,模式還需要乙個環境角色。
5.環境角色(context): 提供直譯器之外的一些全域性資訊,比如變數的真實量值等。
乙個示意性實現
這裡給出乙個最簡單的文法和對應的直譯器模式的實現,這個簡單文法如下:
抽象語法樹(ast)的每乙個節點都代表乙個語句,而在每乙個節點上都可以執行解釋方法。
直譯器模式系統的結構圖:
首先,抽象表示式角色(expression)宣告了由三個方法組成的介面,其中最重要的就是解釋操作方法 interpret() 方法。
其次是終結表示式角色:constant, variable。
再次是非終結表示式角色:and, or, not
and非終結表示式代表乙個二元運算,運算的文法是r = r1r2,或者 expression 『and』 expression,
因此,它會有兩個合成的關係指向expression類。
or非終結表示式也是乙個二元運算,運算的文法是r=r1r2,或者 expression 'or' expression,
因此,它也有兩個合成關係指向expression類。
not非終結表示式代表乙個一元運算,文法 r=r1,或者 『not』 expression,因此它只有乙個合成關係指向expression類。
原始碼:
抽象角色expression
publicconstant類abstract
class
expression
publicvariable類class
constant
extends
expression
/*** 解釋操作
*/@override
public
boolean
interpret(context ctx)
/*** 檢驗兩個表示式在結構上是否相同
*/@override
public
boolean
equals(object o)
return
false
; }
/*** 返回表示式的hash code
*/@override
public
inthashcode()
/*** 將表示式轉換成字串
*/@override
public
string tostring()
}
publicand類class
variable
extends
expression
/*** 解釋操作
*/public
boolean
interpret(context ctx)
@override
public
boolean
equals(object o)
return
false
; }
@override
public
inthashcode()
@override
public
string tostring()
}
publicor類class
andextends
expression
/*** 解釋操作
*/@override
public
boolean
interpret(context ctx)
@override
public
boolean
equals(object o)
return
false
; }
@override
public
inthashcode()
@override
public
string tostring()
}
publicnot類class
orextends
expression
@override
public
boolean
interpret(context ctx)
@override
public
boolean
equals(object o)
return
false
; }
@override
public
inthashcode()
@override
public
string tostring()
}
publiccontext類class
notextends
expression
@override
public
boolean
interpret(context ctx)
@override
public
boolean
equals(object o)
return
false
; }
@override
public
inthashcode()
@override
public
string tostring()
}
publicclient類class
context
public
boolean
lookup(variable var)
throws
illegalargumentexception
return
value.booleanvalue();}}
public客戶端定義的布林表示式是:(true and x)or (y and (not x))class
client
}
執行結果:
x=false
y=true
((true andx) or (y and(not x)))=true
這就是直譯器對這個布林表示式解釋的結果。
直譯器模式適用於以下情況:
1. 系統有乙個簡單的語言可供解釋。
2. 一些重**生的問題可以用這種簡單的語言表達。
3. 效率不是主要的考慮。
設計模式 直譯器模式
未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...
設計模式 直譯器模式
直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解釋執行,並...
設計模式 直譯器模式
直譯器模式 interpreter pattern 提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。...