設計模式 直譯器模式

2021-10-10 22:11:27 字數 1826 閱讀 9360

基本介紹

在編譯原理中,乙個算數表示式通過詞法分析器形成詞法單元,而後這些詞法單元再通過語法分析器構建語法分析樹,最終形成乙個抽象的語法分析樹。這裡的詞法分析器和語法分析器都可以看做是直譯器

直譯器模式(interpreter pattern):是指定乙個語言(表示式),定義他的文法的一種表示,並定義乙個直譯器,使用該直譯器來解釋語言中的句子(表示式)

應用場景

a.應用可以將乙個需要解釋執行的語言中的句子表示作為乙個抽象語法樹

b.乙個重複出現的問題可以用一種簡單的語言來表達

c.乙個簡單語法需要解釋的場景

這樣的例子還有,比如編譯器,運算表示式計算,正規表示式,機械人等

直譯器模式的注意事項和細節

當乙個語言需要解釋執行,可將該語言中的句子表示為乙個抽象語法樹,就可以考慮使用直譯器模式,讓程式具有更好的擴充套件性

使用直譯器模式可能帶來的問題:直譯器模式會引起類膨脹,直譯器模式使用遞迴呼叫方法,將會導致非常複雜,效率可能降低

**實現

通過直譯器模式完成計算器的功能,直譯器將公式轉換為數值和運算子

/**

* 抽象類表示式,通過hashmap的鍵值對,可以獲取到變數的值

*/public

abstract

class

expression

/** * 變數的直譯器

* @author administrator

* */

public

class

varexpression

extends

expression

//根據變數的名稱返回對應的值

@override

public

intinterpreter

(map

var)

}/**

* 抽象運算子直譯器,每個運算子都只跟自己左右兩個數字有關係

* @author administrator

* */

public

class

symbolexpression

extends

expression

@override

public

intinterpreter

(map

var)

}//加法直譯器

public

class

addexpression

extends

symbolexpression

@override

public

intinterpreter

(map

var)

}//減法直譯器

public

class

subexpression

extends

symbolexpression

@override

public

intinterpreter

(map

var)

}//計算器類

public

class

calculator

}this

.expression = stack.

pop();

}public

intrun

(map

var)

}//客戶端

public

class

client

}

設計模式 直譯器模式

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

設計模式 直譯器模式

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

設計模式 直譯器模式

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