解釋器模式 深度解析(2)


上一章已經初步介紹了解釋器模式

這一章將 通過模式的 適用環境 ,解決方案,解決問題 ,模式應用實例來進一步介紹解釋其模式

 

模式定義:

解釋器模式(Interpreter Pattern) :定義語言的文法,並且建立一個解釋器來解釋該語言中的句子,這里的“語言”意思是使用規定格式和語法的代碼,它是一種類行為型模式。

 

適用環境:

在以下情況下可以使用解釋器模式:

可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹。

一些重復出現的問題可以用一種簡單的語言來進行表達。

文法較為簡單。

效率不是關鍵問題。

一些重復發生的事情包含固定的一系列操作類型,比較適合用解釋器模式來實現。如果一種特定類型的問題發生的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子.這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題.

模式結構

 

模式結構

解釋器模式包含如下角色:

Abstract Expression: 抽象表達式

Terminal Expression: 終結符表達式

Nonterminal Expression: 非終結符表達式

Context: 環境類

Client: 客戶類

模式分析

解釋器模式描述了如何為簡單的語言定義一個文法,如何在該語言中表示一個句子,以及如何解釋這些句子。

 

解決問題:

比如加減乘除四則運算,但是公式每次都不同,比如可配置,有時是a + b - c x d,有時是a x b + c - d,等等個,公式千變萬化,但是都是由加減乘除四個非終結符來連接的,這時我們就可以使用解釋器模式。

 

解決方案:

文法規則

文法規則實例:

expression ::= value | symbol

symbol ::= expression '+' expression | expression '-' expression

value ::= an integer //一個整數值

在文法規則定義中可以使用一些符號來表示不同的含義,如使用“|”表示或,使用“{”和“}”表示組合,使用“*”表示出現0次或多次等,其中使用頻率最高的符號是表示或關系的“|” 。

抽象語法樹:

除了使用文法規則來定義一個語言,在解釋器模式中還可以通過一種稱之為抽象語法樹(Abstract Syntax Tree, AST)的圖形方式來直觀地表示語言的構成,每一棵抽象語法樹對應一個語言實例。

模式分析

抽象語法樹描述了如何構成一個復雜的句子,通過對抽象語法樹的分析,可以識別出語言中的終結符和非終結符類。

在解釋器模式中,每一種終結符和非終結符都有一個具體類與之對應,正因為使用類來表示每一個語法規則,使得系統具有較好的擴展性和靈活性。

模式優缺點

解釋器模式的優點

易於改變和擴展文法。

易於實現文法。

增加了新的解釋表達式的方式。

解釋器模式的缺點

對於復雜文法難以維護。

執行效率較低。

應用場景很有限。

模式應用實例

(1) 解釋器模式在使用面向對象語言實現的編譯器中得到了廣泛的應用,如Smalltalk語言的編譯器。

(2) 目前有一些基於Java抽象語法樹的源代碼處理工具,如在Eclipse中就提供了Eclipse AST,它是Eclipse JDT的一個重要組成部分,用來表示Java語言的語法結構,用戶可以通過擴展其功能,創建自己的文法規則。

(3) 可以使用解釋器模式,通過C++、Java、C#等面向對象語言開發簡單的編譯器,如數學表達式解析器、正則表達式解析器等,用於增強這些語言的功能,使之增加一些新的文法規則,用於解釋一些特定類型的語句。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM