設計模式之直譯器模式

2021-08-26 20:16:01 字數 1903 閱讀 5935

解析器模式是一種行為型設計模式。其思想是:給定乙個語言, 定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子

解析器模式涉及4個角色:

結構圖: 

(**於網路)

下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a+b-c,然後要求使用者輸入每個變數的具體值,如a=1b=2c=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模式是一種簡單的語法直譯器構架。換一種解釋就是定義乙個語法,定義乙個直譯器,該直譯器處理該語法句子將某些複雜問題,表達...