设计模式的理解:解释器模式 Interpreter
解釋器模式(Interpreter Pattern)提供了評(píng)估語(yǔ)言的語(yǔ)法或表達(dá)式的方式,它屬于行為型模式。這種模式實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口解釋一個(gè)特定的上下文。這種模式被用在 SQL 解析、符號(hào)處理引擎等。
這種模式的難點(diǎn)主要是文法解析算法的設(shè)計(jì),需要了解些編譯原理的知識(shí)。
所謂終結(jié)符,就是文法中不可再細(xì)分的字符,例如關(guān)鍵字,變量,運(yùn)算符,結(jié)束符,常量等。? 非終結(jié)符就是還可以再劃分的東西,例如 條件表達(dá)式,算術(shù)表達(dá)式,代碼塊等
編譯的步驟分為四大步驟:
1)詞法分析 : 把輸入的字符串拆分成單詞,判斷出哪些單詞是 運(yùn)算符,介詞(關(guān)鍵字),數(shù)字,變量名。創(chuàng)建單詞對(duì)象
2)語(yǔ)法分析 : 語(yǔ)法分析有自上而下和自下而上兩種分析方法,用來(lái)判斷語(yǔ)法是否規(guī)范。
3)語(yǔ)義分析 :用來(lái)判斷在語(yǔ)法正確的情況下是否符合語(yǔ)義,將輸入的表達(dá)式變成一種規(guī)范的格式。
4)目標(biāo)代碼生成:將這些包含語(yǔ)義,格式規(guī)范化的對(duì)象進(jìn)行操作,生成出目標(biāo)代碼;
?
?
例如這樣的一個(gè)文法:
while 布爾表達(dá)式 then 代碼塊 end;其中 while ,then,end 就是終結(jié)符? ,? 布爾表達(dá)式 和代碼塊就是非終結(jié)符。非終結(jié)符可以再劃分,例如
//B代表布爾表達(dá)式,C代表代碼塊則,i代表常量和變量 C->%C% //最開(kāi)始的文法表達(dá)式 C->B //代碼塊可以是一個(gè) 布爾表達(dá)式 C->B ;C //代碼塊可以是一個(gè) 布爾表達(dá)式 ; 代碼塊 B-> i //布爾表達(dá)式可以是單個(gè)變量或常量 B-> i >i //布爾表達(dá)式可以是 單個(gè)常/變量 > 單個(gè)常/變量 B-> i < i //布爾表達(dá)式可以是 單個(gè)常/變量 < 單個(gè)常/變量 B-> i == i //布爾表達(dá)式可以是 單個(gè)常/變量 == 單個(gè)常/變量 B-> B && B //布爾表達(dá)式可以是 布爾表達(dá)式 && 布爾表達(dá)式 B-> B || B //布爾表達(dá)式可以是 布爾表達(dá)式 || 布爾表達(dá)式 B-> !B //布爾表達(dá)式可以是 !布爾表達(dá)式例如我輸入? ?mynum >8 && mynum < 20 ;
首先第一步,給輸入的表達(dá)式的加上開(kāi)始符,"%mynum >8 && mynum < 20%";之后將要拆分單詞,判斷出 mynum 是變量 , “>” 是一個(gè)終結(jié)符, “8”是一個(gè)常量 ,“&&”是一個(gè)非終結(jié)符,mynum 是變量, “<” 是一個(gè)終結(jié)符, “20”是一個(gè)常量
第二步就是到了代碼”穩(wěn)定”的部分: 根據(jù)輸入的單詞對(duì)象,判斷能不能反推回最開(kāi)始的文法:
"%mynum >8 && mynum < 20%"? 將變量和常量替換成i “% i >i && i<I%”,之后反推回 “%B && B%”;在反推回 “%B%”,再反推回 “%C%”,再反推成最開(kāi)始的表達(dá)式“C” 。能推出開(kāi)始表達(dá)式說(shuō)明語(yǔ)法分析通過(guò)
第三步也是代碼”穩(wěn)定”的部分,語(yǔ)義分析:要對(duì)每個(gè)終結(jié)符進(jìn)行相應(yīng)的判斷操作 例如? <? ?,> ,==,&&的操作邏輯,將操作的邏輯,結(jié)果用對(duì)象進(jìn)行封裝。通常采用三元式表示或者四元式表示的方法。
第四步目標(biāo)代碼生成:就是解析三元式或者四元式,生成出代碼。
當(dāng)然第四步在編譯原理中是為了代碼生成,而在解析器場(chǎng)景中一般是為了得出一個(gè)結(jié)果。
?
?
具體的案例可以參考(沒(méi)用模式,寫的很爛)
詞法分析:https://blog.csdn.net/superSmart_Dong/article/details/79164260
語(yǔ)法/語(yǔ)義分析 :https://blog.csdn.net/superSmart_Dong/article/details/79169332
目標(biāo)代碼生成 :https://blog.csdn.net/superSmart_Dong/article/details/79187150
總結(jié)
以上是生活随笔為你收集整理的设计模式的理解:解释器模式 Interpreter的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设计模式的理解: 访问器模式 Visit
- 下一篇: 设计模式的理解:对23个设计模式的总结