作者 薛之謙chj 轉(zhuǎn)載請注明出處
我的知乎:https://zhuanlan.zhihu.com/c_1229107265379897344
內(nèi)容簡介:

定義:
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
給定一門語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
簡介:
解釋器模式是一種按照規(guī)定的語法(文法)進(jìn)行解析的模式。
就比如編譯器可以將源碼編譯解釋為機(jī)器碼,讓 CPU 能進(jìn)行識別并運(yùn)行。解釋器模式的作用其實(shí)與編譯器一樣,都是將一些固定的文法(即語法)進(jìn)行解釋,構(gòu)建出一個解釋句子的解釋器。
簡單理解,解釋器是一個簡單語法分析工具,它可以識別句子語義,分離終結(jié)符號和非終結(jié)符號,提取出需要的信息,讓我們能針對不同的信息做出相應(yīng)的處理。
解釋器模式?核心:識別文法,構(gòu)建解釋。
主要解決:
如果存在一種特定類型的問題,該類型問題涉及多個不同實(shí)例,但是具備固定文法描述,那么可以使用?解釋器模式?對該類型問題進(jìn)行解釋,分離出需要的信息,根據(jù)獲取的信息做出相應(yīng)的處理。
簡而言之,對于一些固定文法構(gòu)建一個解釋句子的解釋器。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
擴(kuò)展性強(qiáng):在?解釋器模式?中由于語法是由很多類表示的,當(dāng)語法規(guī)則更改時,只需修改相應(yīng)的非終結(jié)符表達(dá)式即可;若擴(kuò)展語法時,只需添加相應(yīng)非終結(jié)符類即可;
增加了新的解釋表達(dá)式的方式;
易于實(shí)現(xiàn)文法:解釋器模式?對應(yīng)的文法應(yīng)當(dāng)是比較簡單且易于實(shí)現(xiàn)的,過于復(fù)雜的語法并不適合使用?解釋器模式?;
缺點(diǎn)
語法規(guī)則較復(fù)雜時,會引起類膨脹:解釋器模式?每個語法都要產(chǎn)生一個非終結(jié)符表達(dá)式,當(dāng)語法規(guī)則比較復(fù)雜時,就會產(chǎn)生大量的解釋類,增加系統(tǒng)維護(hù)困難;
執(zhí)行效率比較低:解釋器模式?采用遞歸調(diào)用方法,每個非終結(jié)符表達(dá)式只關(guān)心與自己有關(guān)的表達(dá)式,每個表達(dá)式需要知道最終的結(jié)果,因此完整表達(dá)式的最終結(jié)果是通過從后往前遞歸調(diào)用的方式獲取得到。當(dāng)完整表達(dá)式層級較深時,解釋效率下降,且出錯時調(diào)試?yán)щy,因?yàn)檫f歸迭代層級太深;
使用場景:
一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來進(jìn)行表達(dá);
一個簡單語法需要解釋的場景;
具體實(shí)現(xiàn):
解釋器模式(Interpreter)
解釋器模式是我們暫時的最后一講,一般主要應(yīng)用在OOP開發(fā)中的編譯器的開發(fā)中,所以適用面比較窄,先看看圖:

Context類是一個上下文環(huán)境類,Plus和Minus分別是用來計(jì)算的實(shí)現(xiàn),代碼如下:
接口類:

實(shí)現(xiàn)類:


Context類:

測試類:

最后輸出正確的結(jié)果:3