建立常規運算式的設計模型

作者:葉木金 wind_inpines[at]yahoo.com.tw

摘要

本文提供建立常規運算式(RegEx,Regular Expression)結構之設計模型。此常規運算式定義特定重覆發生的問題(例如:特定的SQL表示式),運算式包括了常數、變數及運算元,並可根據變數設值並求解。此設計模型包括了常規運算式的結構定義、運算式的產生及運算式的求解(詳見《常規運算式設計模型》一文,有關運算式結構及尋訪演算法,本文不再贅述);本文主要討論根據運算式語法建立運算式結構,內容包括運算式字串拆解及運算結構的建立。

樣式分析

我們以Strategy樣式抽離出拆解字串的不同行為,根據運算字串中的關鍵字的型態,利用Abstract Factory樣式產生出不同的字串拆解器,再將拆解出來的關鍵字以Builder樣式產生運算式結構。

結構

參與者

  1. ExpressionMaker(即為《常規運算式設計模型》的TExprDirector,但在此模型中作了一點修正)

    負責建造運算式結構的處理流程。先透過KeywordParser拆解出運算式字串中的關鍵字,並使用ExpressionBuilder建立運算式結構。

  2. ExpressionBuilder

    定義建立運算式結構之界面,運用Builder樣式逐步建造運算式結構。因為運算式結構為樹狀結構,在實務上會以Visitor樣式來實現(參見《常規運算式設計模型》)。

  3. KeywordParserFactory

    定義產生關鍵字拆解器的界面,運用Abstract Factory樣式,使得關鍵字拆解器的產生不會造成與建造運算式結構流程相依。此模型亦採用Singleton樣式讓此實現此界面的類別只會有一個實例。

  4. KeywordParser

    定義拆解運算式字串關鍵字的界面,針對不同的關鍵字型態實作不同的拆解方式。例如IdentityParser實現拆解一般識別字、TextParser實現拆解由引號括起來的字串及SignParser實現拆解符號,日後也可以根據關鍵字型態的增加而增添應的實作。

合作

實作

以下說明此模型一些實作細節:

  1. 關鍵字型態

    ExpressionMaker實作決定關鍵字型態的操作,一般而言我們會以關鍵字首來決定其型態為何(識別字、字串或符號)。如果有前導空白或跳格鍵時,應該往後取得關鍵字首。此外,當拆解完畢時,應取得特定的關鍵字型態代表字串結束,就像ASCII字串的控制字元一樣(如CR、LF、EOF等)。

  2. 拆解引號及跳脫字元

    實作拆解由引號括起之字串時,當遇到非第一個引號的引號時,如下一個字元不是為引號則為字串結束;否則須往後繼續拆解字元。若遇到跳脫字元時,則須往後拆解一個字元。ExpressionMaker提供取得拆解位置字元及設定字元位置之操作界面,並以自委託方式呼叫KeywordParser的拆解關鍵字操作界面,故可透過ExpressionMaker提供的操作界面讀取字元及設定下一個拆解位置。

結語

此設計模型除了應用在運算式結構的建立外,也可運用在資料轉譯的機制。其實廣義地說,我們是把運算式的字串格式轉成樹狀結構格式,因此適當地把字串中的Keyword元素(例如Flat File結構)及運算式結構(EDI or XML Schema)的語意予以擴充,屆時,定義一個Translator界面取代原設計模型的ExpressionMaker類別,實作此界面的類別只要根據特定的資料結構定義實作取得資料元素的型態(亦即資料元素表頭)及存取raw資料的操作,就可以擴充此機制以達到資料轉譯的功能。