解釋器模式本質:為某一款軟件設計一種腳本語言,序列化軟件中的方法,以便通過腳本來操作軟件。最典型的例子就是Windows的Powershell,據說作者當年結果很悲催,利用空閑時間開發,還被微軟認定為不務正業,做降薪降級處理。
本文目錄
一、解釋器模式簡介
??????????????????????二、解釋器模式范例
三、需要安裝的軟件、工具包
四、共享代碼
一、解釋器模式簡介
解釋器模式解決的實際問題:
在軟件開發中,會遇到有些問題多次重復出現,而且有一定的相似性和規律性。如果自己設計一個簡單的腳本語言,就可以靈活的處理問題,遇到特殊需求可以在軟件頂層自定義和擴展功能。使用解釋器模式是比較好選著。
解釋器模式的定義:
解釋器(Interpreter)模式的定義:給分析對象定義一個語言,并定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。——維基百科
解釋器模式的優點如下:
1、擴展性好。由于在解釋器模式中使用類來表示語言的文法規則,因此可以通過繼承擴展功能,符合開閉原則。
2、容易實現。在語法樹中的每個表達式節點類都是相似的,所以實現其擴展較為容易。
3、組合復用。可以通過組合復用已有的功能實現新的功能(在性能要求不高的前提下)。
解釋器模式的缺點如下:
1、比正常的生成的代碼執行效率低。解釋器模式中通常使用大量的循環和遞歸調用,當要解釋的句子較復雜時,其調用效率低,適當約束使用范圍,不要將其完全當通用編程語言使用,限制遞歸調用次數,使系統邏輯清晰,更容易調試。
2、會增加很多類。解釋器模式中的每條規則至少需要定義一個類,當系統包含的規則越多,類的個數就越多,會導致類級數膨脹,盡量使用當前功能組合,除非特別強調性能才新添語法規則。
解釋器模式包含以下主要角色:
1、AbstractExpression(抽象表達式):在抽象表達式中聲明了抽象的解釋操作,它是所有終結符表達式和非終結符表達式的公共父類。(抽象編程下可以一直遞歸下去主要包含解釋方法 )
2、終結符表達式(Terminal Expression)角色:是抽象表達式的子類,用來實現文法中與終結符相關的操作,文法中的每一個終結符都有一個具體終結表達式與之相對應。(不可以遞歸的點的節點,直接得到結果)
3、非終結符表達式(Nonterminal Expression)角色:也是抽象表達式的子類,用來實現文法中與非終結符相關的操作,文法中的每條規則都對應于一個非終結符表達式。(作為一個語法轉折點,可以持續遞歸,和抽象表達式相通)
4、Context(環境類):環境類又稱為上下文類,保存中間變量等功能。
解釋器的UML關系圖如下:
二、解釋器模式范例
我們以計算為例來寫一個解釋器模式,具體UML關系如下圖:
1、終結符:Variant T:
1.1、Variant T:Double T、String T;
2、非終結符:Calc T、System T兩類。
2.2、System:Show Variable。
計算的文法規則為FUN,V1,V3,V3,......:其中首個字符串FUN為表達式名稱,V1,V2,V3....為變量,輸入輸出為FUN規定,其中用逗號隔開,為了方便使用中英文逗號均可。
例子:SUB,a,b,c含義為a+b=c =>ADD,第一個字符串為表達式名稱,a,b類型為變量或常數,c為變量或空字符,為變量時保存數據,為空字符不保存結果,變量不能以數字開頭。
下邊開始編程。
1、創建三個類AbstractExpression、Noterminal Expression和Terminal Expression,其中Noterminal Expression和Terminal Expression繼承至AbstractExpression。當前類關系如下圖:
2、創建一個類命名為Context。
3、在AbstractExpression添加兩個動態VI Interpert(Info)和Tostring()提供給子類重寫。
4、創建類Variant T、Calc T、System T繼承至Terminal Expression,當前類關系如下圖:
5、創建類Double T、String T繼承至Variant T,當前類關系如下圖:
6、創建類ADD Sub繼承至Calc T,當前類關系如下圖:
7、創建類Show Variable繼承至System T,當前類關系如下圖:
8、為Context添加私有屬性和方法。
8.1、添加一個數據引用,值類型為變體,命名為Variable Map;
8.2、添加字符串引用并命名為Log ref,創建其數據成員訪問;
8.3、添加靜態VI命名為Get Variabe,用于獲取數據中的表達式。
8.4、添加靜態VI命名為Set Variabe,用于保存數據中的表達式。
8.5、添加一個靜態VI命名為Do Interpert,用于執行文本表達式,其工作方式是先獲取表達式,然后執行Interpert()動態方法。
8.6、創建Write Log方法,用于打印執行各種狀態。
8.7、創建Initial Variable方法,初始化數據引用。
8.8、創建Dispose Variable方法,銷毀其數據引用。
先創建終結表達式的成員方法:
9、在Double T中添加數值控件并創建其數據成員訪問、重寫Double T父類方法Interpert(Info)和Tostring(),先在表達式尋找是否存在,如果存在則為變量,不存在則為常量。
10、在String T中添加字符控件并創建其數據成員訪問、重寫Double T父類方法Interpert(Info)和Tostring()。
11、在ADD的私有數據中添加三個AbstractExpression命名為x,y,Result并創建其數據成員訪問,三個數據分別表示計算輸入和輸出結果。然后重寫Interpert(Info)和Tostring()。
11、在SUB的私有數據中添加三個AbstractExpression命名為x,y,Result并創建其數據成員訪問,三個數據分別表示計算輸入和輸出結果。然后重寫Interpert(Info)和Tostring()。
12、重寫Show Variable的動態方法,如果是變量就對變量執行Tostring操作然后顯示,如果不是就直接顯示。
下邊使用使用上邊的類編寫運行代碼:
13、創建一個VI命名為Example,放置Context、double T、String T、ADD、SUB、Show Variable。如下圖連線,其中a、b、c為double T。
14、創建一個字符串顯示控件,創建其引用設置到Context中,在后端添加Do Interpert和文本表達式后,在前后添加創建和銷毀引用方法。文本注釋:
ADD,100,10,a//a=100+10
Show,ADD//顯示ADD的計算過程
Show,a//顯示參數a的值
SUB,a,b,c//c=a+b
Show,SUB//顯示SUB的計算過程
Show,c//顯示參數c的值
15、下邊圖片是輸出結果:
小結:上面的代碼完全實現了開始的設想,運行時將文本表達式翻譯成代碼執行結果,將結果保存到定義的變量中。
上面代碼還存在一些問題:
1、當函數輸入錯誤時的處理;
2、參數輸入錯誤的處理,參數的表達式定義;
3、邏輯控制 if for call SubContext。
本文是自動化測試架構的核心內容,本來想放到Pro里講解,但是覺得沒意義,直接在這里寫完,Pro里會有部分優秀的設計加進去完善部分功能,這個也是我寫文章的核心宗旨:寫一些有用的設計,而且可以幫助讀者實際工作中應用,不會只講大道理。
-
軟件
+關注
關注
69文章
4799瀏覽量
87175 -
腳本語言
+關注
關注
0文章
48瀏覽量
8211 -
工具包
+關注
關注
0文章
46瀏覽量
9525 -
解釋器
+關注
關注
0文章
103瀏覽量
6499
原文標題:LabVIEW的編程之道—解釋器模式
文章出處:【微信號:LabVIEW的編程之道,微信公眾號:LabVIEW的編程之道】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論