設計模式 直譯器

2022-06-08 09:39:11 字數 4289 閱讀 2645

直譯器模式是類的行為模式。

給定乙個語言後,直譯器模式可以定義出其文法的一種表示,

並同時提供乙個直譯器。客戶端可以使用這個直譯器來解釋這個語言中的句子。

語言、直譯器和瀏覽器

直譯器模式只描述直譯器是怎麼工作的,並不指名怎樣在執行時建立新的直譯器。

雖然廣義的將,直譯器不一定要有乙個瀏覽器,但是使用瀏覽器仍然是最常見的建立直譯器的辦法。

乙個瀏覽器可以從乙個檔案或命令列讀入文本性命令,並建立直譯器。

瀏覽器的工作就是將乙個文本性語言翻譯成為等效的直譯器語言。因此,直譯器往往需要瀏覽器。

直譯器模式的結構

模式涉及的角色:

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

public

abstract

class

expression

constant類

public

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()

}

variable類

public

class

variable

extends

expression

/*** 解釋操作

*/public

boolean

interpret(context ctx)

@override

public

boolean

equals(object o)

return

false

; }

@override

public

inthashcode()

@override

public

string tostring()

}

and類

public

class

andextends

expression

/*** 解釋操作

*/@override

public

boolean

interpret(context ctx)

@override

public

boolean

equals(object o)

return

false

; }

@override

public

inthashcode()

@override

public

string tostring()

}

or類

public

class

orextends

expression

@override

public

boolean

interpret(context ctx)

@override

public

boolean

equals(object o)

return

false

; }

@override

public

inthashcode()

@override

public

string tostring()

}

not類

public

class

notextends

expression

@override

public

boolean

interpret(context ctx)

@override

public

boolean

equals(object o)

return

false

; }

@override

public

inthashcode()

@override

public

string tostring()

}

context類

public

class

context

public

boolean

lookup(variable var)

throws

illegalargumentexception

return

value.booleanvalue();}}

client類

public

class

client

}

客戶端定義的布林表示式是:(true and x)or (y and (not x))

執行結果:

x=false

y=true

((true andx) or (y and(not x)))=true

這就是直譯器對這個布林表示式解釋的結果。

直譯器模式適用於以下情況:

1. 系統有乙個簡單的語言可供解釋。

2. 一些重**生的問題可以用這種簡單的語言表達。

3. 效率不是主要的考慮。

設計模式 直譯器模式

未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...

設計模式 直譯器模式

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

設計模式 直譯器模式

直譯器模式 interpreter pattern 提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。...