設計模式之直譯器模式

2021-10-25 05:56:48 字數 3222 閱讀 5470

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

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

應用場景

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

context: 是環境角色,含有直譯器之外的全域性資訊.

abstractexpression: 抽象表示式, 宣告乙個抽象的解釋操作,這個方法為抽象語法樹中所有的節點所共享

terminalexpression: 為終結符表示式, 實現與文法中的終結符相關的解釋操作

nontermialexpression: 為非終結符表示式,為文法中的非終結符實現解釋操作.

說明: 輸入 context 和 terminalexpression 資訊通過 client 輸入即可

1、應用要求

通過直譯器模式來實現四則運算, 如計算 a+b-c 的值

2、思路分析

varexpression 變數表示式

symbolexpression 符號表示式

3、**實現

public

abstract

class

expression

public

abstract

intinterpreter

(hashmap

var)

;}

/**

* 變數的直譯器

* @author administrator

* */

public

class

varexpression

extends

expression

// var 就是

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

@override

public

intinterpreter

(hashmap

var)

}

/**

* 抽象運算符號解析器 這裡,每個運算符號,都只和自己左右兩個數字有關係,

* 但左右兩個數字有可能也是乙個解析的結果,無論何種型別,都是expression類的實現類

* * @author administrator

* */

public

class

symbolexpression

extends

expression

//因為 symbolexpression 是讓其子類來實現,因此 interpreter 是乙個預設實現

@override

public

intinterpreter

(hashmap

var)

}

/**

* 加法直譯器

* @author administrator

* */

public

class

addexpression

extends

symbolexpression

//處理相加

//var 仍然是 ..

//一會我們debug 原始碼,就ok

public

intinterpreter

(hashmap

var)

}

public

class

subexpression

extends

symbolexpression

//求出left 和 right 表示式相減後的結果

public

intinterpreter

(hashmap

var)

}

public

class

calculator

}//當遍歷完整個 chararray 陣列後,stack 就得到最後expression

this

.expression = stack.

pop();

}public

intrun

(hashmap

var)

//然後傳遞給expression的interpreter進行解釋執行

return

this

.expression.

interpreter

(var);}

}

public

class

clienttest

calculator calculator =

newcalculator

(expstr)

; system.out.

println

("運算結果:"

+ expstr +

"="+ calculator.

run(var));

}// 獲得表示式

public

static string getexpstr()

throws ioexception

// 獲得值對映

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

應用場景:編譯器、運算表示式計算、正規表示式、機械人等

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

設計模式之直譯器模式

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

設計模式之直譯器模式

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

設計模式之直譯器模式

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