0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解釋器模式需要安裝的軟件、工具包

lhl545545 ? 來源:LabVIEW的編程之道 ? 作者:LabVIEW的編程之道 ? 2022-09-19 14:59 ? 次閱讀

解釋器模式本質(zhì):為某一款軟件設(shè)計一種腳本語言,序列化軟件中的方法,以便通過腳本來操作軟件。最典型的例子就是Windows的Powershell,據(jù)說作者當(dāng)年結(jié)果很悲催,利用空閑時間開發(fā),還被微軟認(rèn)定為不務(wù)正業(yè),做降薪降級處理。

本文目錄

一、解釋器模式簡介

??????????????????????二、解釋器模式范例

三、需要安裝的軟件、工具包

四、共享代碼

一、解釋器模式簡介

解釋器模式解決的實(shí)際問題:

在軟件開發(fā)中,會遇到有些問題多次重復(fù)出現(xiàn),而且有一定的相似性和規(guī)律性。如果自己設(shè)計一個簡單的腳本語言,就可以靈活的處理問題,遇到特殊需求可以在軟件頂層自定義和擴(kuò)展功能。使用解釋器模式是比較好選著。

解釋器模式的定義:

解釋器(Interpreter)模式的定義:給分析對象定義一個語言,并定義該語言的文法表示,再設(shè)計一個解析器來解釋語言中的句子?!S基百科


解釋器模式的優(yōu)點(diǎn)如下:

1、擴(kuò)展性好。由于在解釋器模式中使用類來表示語言的文法規(guī)則,因此可以通過繼承擴(kuò)展功能,符合開閉原則。

2、容易實(shí)現(xiàn)。在語法樹中的每個表達(dá)式節(jié)點(diǎn)類都是相似的,所以實(shí)現(xiàn)其擴(kuò)展較為容易。

3、組合復(fù)用??梢酝ㄟ^組合復(fù)用已有的功能實(shí)現(xiàn)新的功能(在性能要求不高的前提下)。


解釋器模式的缺點(diǎn)如下:

1、比正常的生成的代碼執(zhí)行效率低。解釋器模式中通常使用大量的循環(huán)和遞歸調(diào)用,當(dāng)要解釋的句子較復(fù)雜時,其調(diào)用效率低,適當(dāng)約束使用范圍,不要將其完全當(dāng)通用編程語言使用,限制遞歸調(diào)用次數(shù),使系統(tǒng)邏輯清晰,更容易調(diào)試。

2、會增加很多類。解釋器模式中的每條規(guī)則至少需要定義一個類,當(dāng)系統(tǒng)包含的規(guī)則越多,類的個數(shù)就越多,會導(dǎo)致類級數(shù)膨脹,盡量使用當(dāng)前功能組合,除非特別強(qiáng)調(diào)性能才新添語法規(guī)則。

解釋器模式包含以下主要角色:

1、AbstractExpression(抽象表達(dá)式):在抽象表達(dá)式中聲明了抽象的解釋操作,它是所有終結(jié)符表達(dá)式和非終結(jié)符表達(dá)式的公共父類。(抽象編程下可以一直遞歸下去主要包含解釋方法 )

2、終結(jié)符表達(dá)式(Terminal Expression)角色:是抽象表達(dá)式的子類,用來實(shí)現(xiàn)文法中與終結(jié)符相關(guān)的操作,文法中的每一個終結(jié)符都有一個具體終結(jié)表達(dá)式與之相對應(yīng)。(不可以遞歸的點(diǎn)的節(jié)點(diǎn),直接得到結(jié)果)

3、非終結(jié)符表達(dá)式(Nonterminal Expression)角色:也是抽象表達(dá)式的子類,用來實(shí)現(xiàn)文法中與非終結(jié)符相關(guān)的操作,文法中的每條規(guī)則都對應(yīng)于一個非終結(jié)符表達(dá)式。(作為一個語法轉(zhuǎn)折點(diǎn),可以持續(xù)遞歸,和抽象表達(dá)式相通)

4、Context(環(huán)境類):環(huán)境類又稱為上下文類,保存中間變量等功能。

解釋器的UML關(guān)系圖如下:

e2236edc-3733-11ed-ba43-dac502259ad0.png

二、解釋器模式范例

我們以計算為例來寫一個解釋器模式,具體UML關(guān)系如下圖:

e252fc24-3733-11ed-ba43-dac502259ad0.png

1、終結(jié)符:Variant T:

1.1、Variant T:Double T、String T;

2、非終結(jié)符:Calc T、System T兩類。

2.1、Calc T:Add 、Sub;

2.2、System:Show Variable。

計算的文法規(guī)則為FUN,V1,V3,V3,......:其中首個字符串FUN為表達(dá)式名稱,V1,V2,V3....為變量,輸入輸出為FUN規(guī)定,其中用逗號隔開,為了方便使用中英文逗號均可。

例子:SUB,a,b,c含義為a+b=c =>ADD,第一個字符串為表達(dá)式名稱,a,b類型為變量或常數(shù),c為變量或空字符,為變量時保存數(shù)據(jù),為空字符不保存結(jié)果,變量不能以數(shù)字開頭。

下邊開始編程。

1、創(chuàng)建三個類AbstractExpression、Noterminal Expression和Terminal Expression,其中Noterminal Expression和Terminal Expression繼承至AbstractExpression。當(dāng)前類關(guān)系如下圖:

e269c88c-3733-11ed-ba43-dac502259ad0.png

2、創(chuàng)建一個類命名為Context。

3、在AbstractExpression添加兩個動態(tài)VI Interpert(Info)和Tostring()提供給子類重寫。

e27789d6-3733-11ed-ba43-dac502259ad0.png

e2987358-3733-11ed-ba43-dac502259ad0.png

4、創(chuàng)建類Variant T、Calc T、System T繼承至Terminal Expression,當(dāng)前類關(guān)系如下圖:

e2a929d2-3733-11ed-ba43-dac502259ad0.png

5、創(chuàng)建類Double T、String T繼承至Variant T,當(dāng)前類關(guān)系如下圖:

e2ba147c-3733-11ed-ba43-dac502259ad0.png

6、創(chuàng)建類ADD Sub繼承至Calc T,當(dāng)前類關(guān)系如下圖:

e2c9351a-3733-11ed-ba43-dac502259ad0.png

7、創(chuàng)建類Show Variable繼承至System T,當(dāng)前類關(guān)系如下圖:

e2d61a00-3733-11ed-ba43-dac502259ad0.png

8、為Context添加私有屬性和方法。

8.1、添加一個數(shù)據(jù)引用,值類型為變體,命名為Variable Map;

8.2、添加字符串引用并命名為Log ref,創(chuàng)建其數(shù)據(jù)成員訪問;

8.3、添加靜態(tài)VI命名為Get Variabe,用于獲取數(shù)據(jù)中的表達(dá)式。

e2ecc174-3733-11ed-ba43-dac502259ad0.png

e302c46a-3733-11ed-ba43-dac502259ad0.png

8.4、添加靜態(tài)VI命名為Set Variabe,用于保存數(shù)據(jù)中的表達(dá)式。

e31cb53c-3733-11ed-ba43-dac502259ad0.png

e33dd762-3733-11ed-ba43-dac502259ad0.png

8.5、添加一個靜態(tài)VI命名為Do Interpert,用于執(zhí)行文本表達(dá)式,其工作方式是先獲取表達(dá)式,然后執(zhí)行Interpert()動態(tài)方法。

e34a5d3e-3733-11ed-ba43-dac502259ad0.png

e363157c-3733-11ed-ba43-dac502259ad0.png

8.6、創(chuàng)建Write Log方法,用于打印執(zhí)行各種狀態(tài)。

e3759436-3733-11ed-ba43-dac502259ad0.png

e38c88da-3733-11ed-ba43-dac502259ad0.png

8.7、創(chuàng)建Initial Variable方法,初始化數(shù)據(jù)引用。

e3af66e8-3733-11ed-ba43-dac502259ad0.png

8.8、創(chuàng)建Dispose Variable方法,銷毀其數(shù)據(jù)引用。

e3d52b94-3733-11ed-ba43-dac502259ad0.png

先創(chuàng)建終結(jié)表達(dá)式的成員方法:

9、在Double T中添加數(shù)值控件并創(chuàng)建其數(shù)據(jù)成員訪問、重寫Double T父類方法Interpert(Info)和Tostring(),先在表達(dá)式尋找是否存在,如果存在則為變量,不存在則為常量。

e3f5513a-3733-11ed-ba43-dac502259ad0.png

e415942c-3733-11ed-ba43-dac502259ad0.png

e433e576-3733-11ed-ba43-dac502259ad0.png

10、在String T中添加字符控件并創(chuàng)建其數(shù)據(jù)成員訪問、重寫Double T父類方法Interpert(Info)和Tostring()。

e454a374-3733-11ed-ba43-dac502259ad0.png

e465ad40-3733-11ed-ba43-dac502259ad0.png

e485bc8e-3733-11ed-ba43-dac502259ad0.png

11、在ADD的私有數(shù)據(jù)中添加三個AbstractExpression命名為x,y,Result并創(chuàng)建其數(shù)據(jù)成員訪問,三個數(shù)據(jù)分別表示計算輸入和輸出結(jié)果。然后重寫Interpert(Info)和Tostring()。

e497e4b8-3733-11ed-ba43-dac502259ad0.png

e4abbd26-3733-11ed-ba43-dac502259ad0.png

11、在SUB的私有數(shù)據(jù)中添加三個AbstractExpression命名為x,y,Result并創(chuàng)建其數(shù)據(jù)成員訪問,三個數(shù)據(jù)分別表示計算輸入和輸出結(jié)果。然后重寫Interpert(Info)和Tostring()。

e4d13f2e-3733-11ed-ba43-dac502259ad0.png

e4e93606-3733-11ed-ba43-dac502259ad0.png

12、重寫Show Variable的動態(tài)方法,如果是變量就對變量執(zhí)行Tostring操作然后顯示,如果不是就直接顯示。

e5142bea-3733-11ed-ba43-dac502259ad0.png

e5352bc4-3733-11ed-ba43-dac502259ad0.png

下邊使用使用上邊的類編寫運(yùn)行代碼:

13、創(chuàng)建一個VI命名為Example,放置Context、double T、String T、ADD、SUB、Show Variable。如下圖連線,其中a、b、c為double T。e55a3dd8-3733-11ed-ba43-dac502259ad0.png

14、創(chuàng)建一個字符串顯示控件,創(chuàng)建其引用設(shè)置到Context中,在后端添加Do Interpert和文本表達(dá)式后,在前后添加創(chuàng)建和銷毀引用方法。文本注釋:

ADD,100,10,a//a=100+10

Show,ADD//顯示ADD的計算過程

Show,a//顯示參數(shù)a的值

SUB,a,b,c//c=a+b

Show,SUB//顯示SUB的計算過程

Show,c//顯示參數(shù)c的值

e572fba2-3733-11ed-ba43-dac502259ad0.png

15、下邊圖片是輸出結(jié)果:

e583eee4-3733-11ed-ba43-dac502259ad0.png

小結(jié):上面的代碼完全實(shí)現(xiàn)了開始的設(shè)想,運(yùn)行時將文本表達(dá)式翻譯成代碼執(zhí)行結(jié)果,將結(jié)果保存到定義的變量中。

上面代碼還存在一些問題:

1、當(dāng)函數(shù)輸入錯誤時的處理;

2、參數(shù)輸入錯誤的處理,參數(shù)的表達(dá)式定義;

3、邏輯控制 if for call SubContext。

本文是自動化測試架構(gòu)的核心內(nèi)容,本來想放到Pro里講解,但是覺得沒意義,直接在這里寫完,Pro里會有部分優(yōu)秀的設(shè)計加進(jìn)去完善部分功能,這個也是我寫文章的核心宗旨:寫一些有用的設(shè)計,而且可以幫助讀者實(shí)際工作中應(yīng)用,不會只講大道理。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4944

    瀏覽量

    87500
  • 腳本語言
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    8225
  • 工具包
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

    9537
  • 解釋器
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    6513

原文標(biāo)題:LabVIEW的編程之道—解釋器模式

文章出處:【微信號:LabVIEW的編程之道,微信公眾號:LabVIEW的編程之道】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請教高手LabSQL工具包如何安裝?

    請教高手LabSQL工具包如何安裝
    發(fā)表于 11-15 19:35

    labview工具包安裝問題

    新手一枚,請教一下下完了工具包具體安裝到哪里,如何使用?
    發(fā)表于 08-29 21:55

    2012工具包安裝問題

    安裝了控制設(shè)計與仿真工具包然后用注冊機(jī)激活了為何在控件中還是顯示空白?
    發(fā)表于 11-04 20:18

    labview做報表,工具包安裝問題

    `本人剛接觸labview報表。我的labview2012紅圈部分沒有,是不是就是沒有安裝這個報表生成工具包造成的???`
    發(fā)表于 05-04 17:34

    labview DSC工具包無法安裝

    labview DSC工具包無法安裝,提示我沒有安裝labview,我已經(jīng)正確安裝并激活了的呀。求解呀無法
    發(fā)表于 06-05 17:17

    如何訪問已與eIQ工具包一起安裝的python版本?

    我正在嘗試在遠(yuǎn)程 SSH 板上安裝 eIQ 工具包,DEBIX Model A 板具有 I.MX 8M Plus EdgeVerse 處理和 Ubuntu 20.04。 我下載了 eIQ
    發(fā)表于 06-07 06:46

    固件工具包

    固件工具包 修改工具包 高興向大家公布這個信息! 首先介紹一下這個工具地用途: 1、修改固件 - 通過此工具能夠修改固件中絕大多數(shù)地信息及配置。 2、...
    發(fā)表于 03-16 14:49 ?71次下載

    MATLAB 2016a 工具包中-英對照

    MATLAB 2016a 工具包中-英對照 方便安裝MATLAB的時候選擇需要工具,以節(jié)省安裝所需的磁盤大小
    發(fā)表于 04-20 08:58 ?42次下載

    LTC2937-軟件開發(fā)工具包

    LTC2937-軟件開發(fā)工具包
    發(fā)表于 05-31 20:57 ?6次下載
    LTC2937-<b class='flag-5'>軟件開發(fā)工具包</b>

    如何在arduino IDE上安裝STM32的開發(fā)板工具包

    如何在arduino IDE上安裝STM32的開發(fā)板工具包
    發(fā)表于 11-01 17:51 ?3次下載

    LabVIEW AI視覺工具包(非NI Vision)下載與安裝教程

    LabVIEW AI視覺工具包(非NI Vision)下載與安裝教程
    的頭像 發(fā)表于 02-20 18:21 ?3868次閱讀
    LabVIEW AI視覺<b class='flag-5'>工具包</b>(非NI Vision)下載與<b class='flag-5'>安裝</b>教程

    iSCSI驅(qū)動工具包

    電子發(fā)燒友網(wǎng)站提供《iSCSI驅(qū)動工具包.exe》資料免費(fèi)下載
    發(fā)表于 08-01 14:43 ?0次下載
    iSCSI驅(qū)動<b class='flag-5'>器</b><b class='flag-5'>工具包</b>

    OneInstall工具包

    電子發(fā)燒友網(wǎng)站提供《OneInstall工具包.exe》資料免費(fèi)下載
    發(fā)表于 08-18 14:54 ?0次下載
    OneInstall<b class='flag-5'>工具包</b>

    OneCore存儲軟件開發(fā)工具包(SDK)

    電子發(fā)燒友網(wǎng)站提供《OneCore存儲軟件開發(fā)工具包(SDK).pdf》資料免費(fèi)下載
    發(fā)表于 08-22 14:53 ?0次下載
    OneCore存儲<b class='flag-5'>軟件開發(fā)工具包</b>(SDK)

    NPOI WEG報表工具包簡介

    很久以前就知道有NPOI這個報表工具包,因?yàn)橛蠳I自帶的工具包就沒有詳細(xì)研究過。當(dāng)前工作中幾臺電腦因?yàn)?b class='flag-5'>安裝OFFICE版本問題,或其它原因?qū)е伦詭蟊頍o法使用,就找來了一個群友共享的的NPOI
    的頭像 發(fā)表于 11-06 10:05 ?1054次閱讀
    NPOI WEG報表<b class='flag-5'>工具包</b>簡介