1. 程式人生 > >java 開發模式之十九 :解析器模式

java 開發模式之十九 :解析器模式

原理或定義

給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。屬於行為類模式

結構

AbstractExpression:宣告一個抽象的Interpret方法,抽象語法樹中所有的節點都必須實現該抽象方法。

TerminalExpression:-實現和語法中末端符號相關的Interpret方法。在每個句子的末端符號中均需要一個TerminalExpression例項。

NonterminalExpression:另外一個實現了AbstractExpression 介面的類,用來處理語法樹中非末端節點的語法。它含有下一個AbstractExpression(s)的引用,呼叫它每個子節點的Interpret方法。

Context:Interpreter方法所需要的資訊的容器,該資訊對Interpreter而言全域性可見。充當幾個AbstractExpresssion 例項之間的通訊頻道。

類圖

使用場景

1、當有一個語言需要解釋執行,並且你可以把該語言中的句子表示為一個抽象的語法樹時,可使用直譯器模式.而當存在以下情況時,該模式的效果最好:

2、該文法簡單,對於複雜的文法,文法的類層次變得龐大而無法管理.此時,語法分析程式生成器這樣得工具時更好得選擇。它們無需構建抽象語法樹即可解釋表示式,這樣可以節省空間而且還可以節省時間;

3、效率不是一個關鍵的問題,最高效的直譯器通常不是通過直接解釋語法分析樹實現的,而是首先把他們轉換成另外一種形式.例如:正則表示式通常被轉換成狀態機。

優缺點

主要優點有:

1. 直譯器是一個簡單的語法分析工具,它最顯著的優點就是擴充套件性,修改語法規則只需要修改相應的非終結符就可以了,若擴充套件語法,只需要增加非終結符類就可以了

缺點主要有

1.直譯器模式會引起類的膨脹:每個語法都需要產生一個非終結符表示式,語法規則比較複雜時,就可能產生大量的類檔案,為維護帶來非常多的麻煩

2.直譯器模式採用遞迴呼叫方法:遞迴都是一個不推薦的方式(只在必要條件下使用),它將導致除錯非常複雜。低。

它會引起效率、效能以及維護等問題,一般在大中型的框架型專案中能找到它的身影,如一些資料分析工具、報表設計工具、科學計算工具等,如果你確實遇到一種特定型別的問題發生的頻率足夠高

的情況,準備使用直譯器模式時,可以考慮一下Expression4JMESPJep 等開源的解析工具包