在編譯原理中,乙個算術表示式通過詞法分析器形成詞法單元,而後這些詞法單元再通過語法分析器構建語法分析樹,最終形成一顆抽象的語法分析樹。這裡的詞法分析器和語法分析器都可以看做是直譯器
直譯器模式(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,然後要求使用者輸入每個變數的具體值,如...