設計模式 十六 直譯器模式

2021-09-03 08:14:48 字數 2553 閱讀 8096

interpreter pattern

直譯器模式(interpreter pattern):定義乙個語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的「語言」是指使用規定格式和語法的**。

直譯器模式是一種類行為型模式。它用於描述如何使用物件導向語言構成乙個簡單的語言直譯器。

在某些情況下,為了更好地描述某一些特定型別的問題,我們可以建立一種新的語言,這種語言擁有自己的表示式和結構,即文法規則,這些問題的例項將對應為該語言中的句子。此時,可以使用直譯器模式來設計這種新的語言。

在直譯器模式中每乙個文法規則都將對應乙個類,擴充套件、改變文法以及增加新的文法規則都很方便。

直譯器模式描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。

抽象語法樹:

每個文法規則的語言例項都可以表示為乙個抽象語法樹(abstract syntax tree, ast),在圖中終結符表示式類的例項作為樹的葉子節點,而非終結符表示式類的例項作為非葉子節點,它們可以將終結符表示式類的例項以及包含終結符和非終結符例項的子表示式作為其子節。

直譯器是使用物件導向語言構成乙個簡單的語言直譯器,所以它的優缺點都和物件導向有關。

優點:

缺點:

適用場景

直譯器模式有固定的流程,即文法規則,按照文法規則一一對應即可。難點應該在於文法規則的整理。

**過程中,應該優先寫expresion的實現類,即abstractnode,語法樹中的葉子節點,然後再考慮拼裝和執行。

每乙個終結符、非終結符表示式都對應乙個類,但也可使用同乙個類表達一些有共性的終結符表示式。

可以思考是不是可以解析成煉表的資料結構,順序解析下去。

具體情況具體分析,非終結符表示式也可以不再包含非終結符表示式,而是將關聯操作封裝在關聯關鍵字上。

// 抽象表示式

abstract

class

abstractnode

// 終結符表示式,direction

class

directionnode

extends

abstractnode

//方向表示式的解釋操作

@override

public string interpret()

else

if(direction.

equalsignorecase

("down"))

else

if(direction.

equalsignorecase

("left"))

else

if(direction.

equalsignorecase

("right"))

else}}

// 終結符表示式 action

class

actionnode

extends

abstractnode

//動作(移動方式)表示式的解釋操作

@override

public string interpret()

else

if(action.

equalsignorecase

("run"))

else}}

// 終結符表示式,distance

class

distancenode

extends

abstractnode

//距離表示式的解釋操作

@override

public string interpret()

}// 非終結符表示式,完整的句子

class

sentencenode

extends

abstractnode

//簡單句子的解釋操作

@override

public string interpret()

}// 非終結符表示式,鍊錶結構

class

andnode

extends

abstractnode

//and表示式解釋操作

@override

public string interpret()

}// 解析類,解析語句,形成鍊錶

// ...

void

handle

(string instruction)

//如果是從頭開始進行解釋,則將前三個單詞組成乙個簡單句子sentencenode並將該句子壓入棧中

else

}this

.node = stack.

pop();

this

.node.

interpret()

;// 從煉表頭開始解析

}

設計模式 直譯器模式

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

設計模式 直譯器模式

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

設計模式 直譯器模式

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