解析器模式是一種行為型設計模式。其思想是:給定乙個語言, 定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。
解析器模式涉及4個角色:
結構圖:
(**於網路)
下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a+b-c
,然後要求使用者輸入每個變數的具體值,如a=1
,b=2
,c=3
,最後螢幕顯示計算結果。篇幅所限,這裡只演示加法和減法運算,有興趣的讀者可以自行擴充套件。
抽象表示式:
public inte***ce expression
非終結符表示式:
public class varexp implements expression
@override
public double interpreter(hashmapvar)
}
終結符表示式:
public abstract class symbolexp implements expression
}// 加法
public class add extends symbolexp
@override
public double interpreter(hashmapvar)
}// 減法
public class minus extends symbolexp
@override
public double interpreter(hashmapvar)
}
計算器:
public class calculator
}this.expression = stack.pop(); // 遍歷完成後取回棧中的元素
}// 實際上,計算已經在構造器裡完成了,這裡只是取回結果的值
public double cal(hashmapvar)
}
客戶:
public class client
// 要求使用者輸入表示式
private string getexp()
// 要求使用者輸入每個變數的值
private hashmapgetvalues(string exp)
}return map;
}}// 測試
class test
}
執行結果:
please defined an expression:直譯器是乙個簡單語法分析工具,它最顯著的優點就是擴充套件性,修改語法規則只要修改相應的非終結符表示式就可以了,若擴充套件語法,則只要增加非終結符類就可以了。a+b-c+b
a = 3
b = 2
c = 1
a+b-c+b = 6.000000
但是,直譯器模式由於使用了大量的迴圈和遞迴,效率是個不容忽視的問題,特別是用於解析複雜、冗長的語法時,效率是難以忍受的,排錯也非常困難。
直譯器模式在實際的系統開發中使用的非常少,因為它會引起效率、效能以及維護等問題,一般在大中型的框架型專案能夠找到它的身影,比如一些資料分析工具、報表設計工具、科學計算工具等等。當確實需要使用直譯器模式時,可以考慮使用expression4j、mesp(math expression string parser)、jep等開源的解析工具包。
設計模式之直譯器模式
直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。使用場景 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙...
設計模式之直譯器模式
直譯器模式 1.直譯器模式 給定乙個語言,定義它文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。比如 在字串中...
設計模式之直譯器模式
interpreter模式也叫直譯器模式,是行為模式之一,它是一種特殊的設計模式,它建立乙個直譯器,對於特定的計算機程式語言,用來解釋預先定義的文法。簡單地說,interpreter模式是一種簡單的語法直譯器構架。換一種解釋就是定義乙個語法,定義乙個直譯器,該直譯器處理該語法句子將某些複雜問題,表達...