作者 薛之謙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.
給定一門語言捂齐,定義它的文法的一種表示友扰,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。
簡介:
解釋器模式是一種按照規(guī)定的語法(文法)進(jìn)行解析的模式吼渡。
就比如編譯器可以將源碼編譯解釋為機(jī)器碼债蜜,讓 CPU 能進(jìn)行識別并運(yùn)行。解釋器模式的作用其實(shí)與編譯器一樣蛛碌,都是將一些固定的文法(即語法)進(jìn)行解釋聂喇,構(gòu)建出一個(gè)解釋句子的解釋器。
簡單理解蔚携,解釋器是一個(gè)簡單語法分析工具希太,它可以識別句子語義,分離終結(jié)符號和非終結(jié)符號酝蜒,提取出需要的信息誊辉,讓我們能針對不同的信息做出相應(yīng)的處理。
解釋器模式?核心:識別文法亡脑,構(gòu)建解釋堕澄。
主要解決:
如果存在一種特定類型的問題邀跃,該類型問題涉及多個(gè)不同實(shí)例,但是具備固定文法描述蛙紫,那么可以使用?解釋器模式?對該類型問題進(jìn)行解釋拍屑,分離出需要的信息,根據(jù)獲取的信息做出相應(yīng)的處理坑傅。
簡而言之僵驰,對于一些固定文法構(gòu)建一個(gè)解釋句子的解釋器。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
擴(kuò)展性強(qiáng):在?解釋器模式?中由于語法是由很多類表示的唁毒,當(dāng)語法規(guī)則更改時(shí)蒜茴,只需修改相應(yīng)的非終結(jié)符表達(dá)式即可;若擴(kuò)展語法時(shí)浆西,只需添加相應(yīng)非終結(jié)符類即可粉私;
增加了新的解釋表達(dá)式的方式;
易于實(shí)現(xiàn)文法:解釋器模式?對應(yīng)的文法應(yīng)當(dāng)是比較簡單且易于實(shí)現(xiàn)的近零,過于復(fù)雜的語法并不適合使用?解釋器模式?诺核;
缺點(diǎn)
語法規(guī)則較復(fù)雜時(shí),會引起類膨脹:解釋器模式?每個(gè)語法都要產(chǎn)生一個(gè)非終結(jié)符表達(dá)式秒赤,當(dāng)語法規(guī)則比較復(fù)雜時(shí)猪瞬,就會產(chǎn)生大量的解釋類,增加系統(tǒng)維護(hù)困難入篮;
執(zhí)行效率比較低:解釋器模式?采用遞歸調(diào)用方法陈瘦,每個(gè)非終結(jié)符表達(dá)式只關(guān)心與自己有關(guān)的表達(dá)式,每個(gè)表達(dá)式需要知道最終的結(jié)果潮售,因此完整表達(dá)式的最終結(jié)果是通過從后往前遞歸調(diào)用的方式獲取得到痊项。當(dāng)完整表達(dá)式層級較深時(shí),解釋效率下降酥诽,且出錯時(shí)調(diào)試?yán)щy鞍泉,因?yàn)檫f歸迭代層級太深;
使用場景:
一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來進(jìn)行表達(dá)肮帐;
一個(gè)簡單語法需要解釋的場景咖驮;
具體實(shí)現(xiàn):
解釋器模式(Interpreter)
解釋器模式是我們暫時(shí)的最后一講,一般主要應(yīng)用在OOP開發(fā)中的編譯器的開發(fā)中训枢,所以適用面比較窄托修,先看看圖:
Context類是一個(gè)上下文環(huán)境類,Plus和Minus分別是用來計(jì)算的實(shí)現(xiàn)恒界,代碼如下:
接口類:
實(shí)現(xiàn)類:
Context類:
測試類:
最后輸出正確的結(jié)果:3