每日Android源碼設計模式之-9、解釋器模式

說實話,這種設計模式太抽象了,使用場景也比較少,基本上也不會用到,大家先來基本了解下就行了。


解釋器模式提供了一種解釋語言的語法或表達式方法。

舉個例子我們要輸出 a開頭,c結尾,中間是任意個b的字符串。

于是我們定義

S::=aA*c

A::=b

::=表示推導,*表示可以有0到N個重復

描述這個集合的文法,稱為形式文法。

描述得是形式語言,定義的是形式文法。


使用場景

1.如果某個的簡單的而語言需要解釋執行,且可以將該語言中的語句表示為一個抽象語法樹。

比如加減運算p+q+m-n可以表示為:

p+q+m-n

2.在某些特定的領域出現不斷重復的問題時,可以將該領域的問題轉化為一種語法規則下的語句,然后構建解釋起來解釋該語句。比如字符串的大小寫轉化,阿拉伯數字轉化為中文的數字等。


實戰:

表達式m+n+p我們來進行解釋。

注意:“+”是非終結符號,m、n、p是非終結符號。

首先定一個抽象算術運算解釋器ArithmeticExpression,里面有一個抽象的解釋方法interpreter,返回具體解析到的值。

兩個具體子類實現它:

1.數字解釋器NumExpression,狗仔函數傳入num=傳入的數字,interpreter返回num;

2.加法運算解釋器,構造函數傳入了兩個ArithmeticExpression類型解釋器對象,保存為成員變量exp1、exp2,其實也就是保存了+兩邊的數字解釋器。

最后interpreter方法進行運算,并且返回運算結果。

return exp1.interpreter() + exp2.interpreter();


我們的解釋器就實現完成了

使用:

把m + n + p注意中間帶有空格用來splite每一個字符得到數組elems[]; 遍歷數組,如果遇到數字就創建Num解釋器,并且壓入棧,如果遇到符號就把上一個棧彈出來,并且把下一個字符也生成Num解釋器,作為兩個參數創建AdditionExpression解釋器,然后把運算解釋器壓入棧。

最后調用棧.pop().interpreter();就能得到結果


Android中的實現

Android中使用解釋器模式太少了,有一個地方,我們在AndroidMaifext.xml里面定義的配置項,就是PackagePaser的parsePackage方法來翻譯解釋的。


優點:靈活的擴展性,需要擴展的時候,增加非終結符解釋器即可。

缺點:每條文法都有一個解釋器,類太多,后期維護困難,且如果文法復雜,構建抽象語法樹會異常繁瑣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 塵世悲歡又怨誰? 一聲無奈淚先催 沽名不染紅塵夢 又見西風落葉堆
    雨巷深處閱讀 436評論 0 3
  • 我在尋找一處風景 它得像紅花一樣的漂亮 卻不能像花那樣的嬌嫩 它需要長久 我在尋找一處風景 它得像青草一般的翠綠 ...
    悅度閱讀 204評論 0 4
  • 無論世界是否待你溫柔,請保持住你的善良,因為好運會與你不期而遇。幾經歲月洗凈鉛華,依然是最初最美的本色,美好終將如...
    AA張一言閱讀 129評論 0 0