天天看點

解釋器模式

解釋器模式是類的行為模式。給定一個語言之後,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。用戶端可以使用這個解釋器來解釋這個語言中的句子。

模式所涉及到4個角色:

抽象表達式(expression)角色:聲明一個所有的具體表達式角色都需要實作的抽象接口。這個接口主要是一個interpret()方法,稱做解釋操作。

終結符表達式(terminal expression)角色:實作了抽象表達式角色所要求的接口,主要是一個interpret()方法;文法中的每一個終結符都有一個具體終結表達式與之相對應。比如有一個簡單的公式r=r1+r2,在裡面r1和r2就是終結符,對應的解析r1和r2的解釋器就是終結符表達式。

非終結符表達式(nonterminal expression)角色:文法中的每一條規則都需要一個具體的非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字,比如公式r=r1+r2中,“+"就是非終結符,解析“+”的解釋器就是一個非終結符表達式。

環境(context)角色:這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如r=r1+r2,我們給r1指派100,給r2指派200。這些資訊需要存放到環境角色中,很多情況下我們使用map來充當環境角色就足夠了。

uml圖

解釋器模式

當有一個語言需要解釋執行,并且你可将該語言中的句子表示為一個抽象文法樹,可以使用解釋器模式。而當存在以下情況時該模式效果最好

該文法的類層次結構變得龐大而無法管理。此時文法分析程式生成器這樣的工具是最好的選擇。他們無需建構抽象文法樹即可解釋表達式,這樣可以節省空間而且還可能節省時間。

效率不是一個關鍵問題,最高效的解釋器通常不是通過直接解釋文法分析樹實作的,而是首先将他們裝換成另一種形式,例如,正規表達式通常被裝換成狀态機,即使在這種情況下,轉換器仍可用解釋器模式實作,該模式仍是有用的。

代碼實作

測試

繼續閱讀