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