給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器適用該表示來解釋語言中的句子。
當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。而當存在以下情況時該模式效果最好:
例:
s ::= aba*ef
a ::= cd
符號「::=」表示推導;符號「*」表示閉包,意思就是符號a可以有0或有n個重複;s和a稱為非終結符號,因為他們能推導出式子右邊的表示式,同時又因為整個推導式是從s出發的,因此,這個s也稱為初始符號;而abef和cd這些字元不能再被推導我們稱之為終結符號。
interpreterpattern
靈活的擴充套件性,當我們想對文法規則進行擴充套件延伸時,只需要增加相應的非終結符直譯器,並在構建抽象語法樹時,使用到新增的直譯器物件進行具體的解釋即可,比較方便。
每一條文法都對應乙個直譯器,會生成大量類,導致後期維護困難。同時,對於過於複雜的文法,構建其抽象語法樹會顯得異常繁瑣,因此,對於複雜的文法並不推薦使用直譯器模式。
表示式「m+n+p」,如果我們使用直譯器模式對該表示式進行解釋,那麼代表數字的m,n,和p三個字母我們就可以看成是終結符號,而「+」這個算術運算符號則可當作非終結符,同時我們可以先建立乙個抽象直譯器表示數**算。
結構
/**
* 算術運算直譯器抽象類
* @author newtrekwang
* @email [email protected]
* @time 2018/8/19 23:22
*/public abstract class athmeticexpression
/** * 數字直譯器,只為了解釋數字
* @author newtrekwang
* @email [email protected]
* @time 2018/8/19 23:24
*/public class numexpression extends athmeticexpression
@override
int interpreter()
}/**
* 運算子直譯器
* @author newtrekwang
* @email [email protected]
* @time 2018/8/19 23:27
*/public abstract class operatorexpression extends athmeticexpression
}/**
* 加法直譯器
* @author newtrekwang
* @email [email protected]
* @time 2018/8/19 23:29
*/public class additionexpressoin extends operatorexpression
/*** 具體解釋+符號
* @return 解釋結果
*/@override
int interpreter()
}/**
* 計算器類
* @author newtrekwang
* @email [email protected]
* @time 2018/8/19 23:30
*/public class calculator {
/*** 用乙個棧儲存並操作所有相關的直譯器
*/private stackmexpstack = new stack<>();
public calculator(string expression){
athmeticexpression exp1,exp2;
// 以空格分開元素
string elements = expression.split(" ");
for (int i = 0;i輸出結果:
13
Android系統設計中的設計模式分析之四
uml中,不同的物件之間的關係有generation,implementation,dependence,association,aggregation,composition這六種關係。其中,generation,implementation,dependence這個比較容易 理解,代表了程式中的...
android設計模式之抽象工廠模式
定義 抽象工廠模式定義為為建立一組相關或者相互依賴的物件提供乙個介面,而且無需指定他們的具體類。它是工廠方法模式的公升級版本。在有多個業務品種,業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。模式中包含的角色及其職責 1.抽象工廠 creator 角色 抽象工廠模式的核心,包含對多...
Android設計模式之(10) 命令模式
命令模式屬於行為模式。如你的上級領導指派給你的a,b,c三項任務。讓你做a,你就做a,讓你做b就做b。指哪打哪。外部的人對於你和你的領導來說,知道你的領導派發了abc任務給你,你也完成abc任務,任務具體是怎麼完成的外部的人並不需要關心。大學的新生入學都會進行軍訓,軍訓的專案有正步,齊步,軍姿等等 ...