直譯器模式(二十三)

2021-08-20 21:35:13 字數 1820 閱讀 8496

直譯器模式(interpreter pattern)是一種按照規定語法進行解析的方案,例如解析四則運算、sql語句等,現在專案中使用較少,其定義如下:

給定一門語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。

1. abstractexpression 抽象直譯器

具體解釋任務由具體實現類完成。

public abstract class abstractexpression
2. terminalexpression 終結符表示式

例如a + b中的ab,這些運算元素除了需要賦值外,不需要做任何處理,功能也基本相同,是語法中的最小單元,相當於組合模式中的葉子。

public class terminalexpression extends abstractexpression

}

3. nonterminalexpression 非終結符表示式

例如a + b中的+號,這些運算符號都會對應乙個具體的業務邏輯,例如加減乘除就是四個不同的非終結符表示式,相當於組合模式中的樹枝。

public class nonterminalexpression extends abstractexpression

public void interpret(context ctx)

}

4. context 環境角色

儲存各個直譯器需要使用到的資料,或是公共功能。

public class context
5. client 客戶端角色

使用直譯器的客戶端,通常在這裡去把按照語言的語法做的表示式,轉換成為使用直譯器物件描述的抽象語法樹,然後呼叫解釋操作。

public class client
容易修改(修改相應非終結符表示式)或擴充套件(新增相應非終結符表示式)語法。

引起類的膨脹,每乙個語法都要產生乙個非終結符表示式,語法複雜時將會產生大量類檔案。

迴圈的遞迴呼叫,帶來的效能問題不容忽視,且難以除錯。

重**生的問題

例如多個伺服器產生的大量日誌,需要對日誌進行分類處理,檔案格式可能不同但是資料要素都是一樣的,按照直譯器的說法就是終結符表示式都是一樣的,不過非終結符表示式需要制定。

一些簡單或者標準的語法需要解釋的場景

例如 sql 語法分析,金融中大量的運算等。不過這些部分也逐漸被專門工具所替代了。

資料分析工具、報表設計工具、科學計算工具等

盡量不要找重要的模組使用直譯器模式,否則維護會是乙個很大的問題。可以選擇使用shelljrubygroovy等指令碼語言來替代直譯器模式。

對效率要求不高的場景(例如可以在晚間執行),因為直譯器模式的效能並不高。

準備使用直譯器模式時,可以考慮一下expression4jmesp(math expression string parser)、jep等開源的解析工具包。它們功能強大,且容易使用,效率也還不錯,沒必要自己從頭開始編寫(使用別人寫好的工具也是乙個很好的選擇)。

設計模式分類以及六大設計原則​

(二十三)直譯器模式

定義 直譯器模式 interpreter 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。interpreter.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace st...

設計模式《二十三》 迭代器模式

提供一種方法順序訪問乙個聚合物件中各個元素,而又無須暴露該物件的內部表示。可以使用不同的方式來遍歷整個整合物件。iterator 抽象迭代,定義訪問和遍歷元素的介面,一般都是固定介面 first,next,isdone last concreteiterator 具體迭代器,實現迭代器介面,完成容器...

python二十三 裝飾器

import time 裝飾器的架子 def timer func start time time.time func stop time time.time print 函式執行時間 s stop time start time def test time.sleep 2 print 函式執行完畢...