成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

第6章:可維護(hù)性軟件構(gòu)建方法 6.3可維護(hù)性構(gòu)建技術(shù)

young.li / 761人閱讀

摘要:遵循特定規(guī)則,利用操作符,終止節(jié)點(diǎn)和其他非終止節(jié)點(diǎn),構(gòu)造新的字符串非終結(jié)符是表示字符串的樹(shù)的內(nèi)部節(jié)點(diǎn)。語(yǔ)法中的生產(chǎn)具有這種形式非終結(jié)符終結(jié),非終結(jié)符和運(yùn)算符的表達(dá)式語(yǔ)法的非終結(jié)點(diǎn)之一被指定為根。

大綱

基于狀態(tài)的構(gòu)建

基于自動(dòng)機(jī)的編程

設(shè)計(jì)模式:Memento提供了將對(duì)象恢復(fù)到之前狀態(tài)的功能(撤消)。

設(shè)計(jì)模式:狀態(tài)允許對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變其行為。

表驅(qū)動(dòng)結(jié)構(gòu)*

基于語(yǔ)法的構(gòu)建

語(yǔ)法和解析器

正則表達(dá)式(regexp)

設(shè)計(jì)模式:解釋器實(shí)現(xiàn)一種專(zhuān)門(mén)的語(yǔ)言。

基于狀態(tài)的構(gòu)建

基于狀態(tài)的編程是一種編程技術(shù),它使用有限狀態(tài)機(jī)(FSM)來(lái)描述程序行為,即使用“狀態(tài)”來(lái)控制程序的流程。

使用有限狀態(tài)機(jī)來(lái)定義程序的行為,使用狀態(tài)來(lái)控制程序的執(zhí)行

例如,在電梯的情況下,可能會(huì)停止,向上移動(dòng),向下移動(dòng),停止,關(guān)閉門(mén)并打開(kāi)門(mén)。

這些都被認(rèn)為是一個(gè)狀態(tài),接下來(lái)發(fā)生的事情是由電梯的當(dāng)前狀態(tài)決定的。
根據(jù)當(dāng)前狀態(tài),決定下一步要執(zhí)行什么操作,執(zhí)行操作之后要轉(zhuǎn)移到什么新的狀態(tài)

如果電梯剛剛關(guān)好,接下來(lái)會(huì)發(fā)生什么情況? 它可以停止,向上移動(dòng)或向下移動(dòng)。

當(dāng)電梯停下時(shí),你預(yù)計(jì)下一個(gè)動(dòng)作是門(mén)打開(kāi),向上移動(dòng)或向下移動(dòng)。

(1) 基于自動(dòng)機(jī)的編程

基于自動(dòng)機(jī)的編程是一種編程模式,其中程序或其一部分被認(rèn)為是有限狀態(tài)機(jī)(FSM)或任何其他形式自動(dòng)機(jī)的模型。

將程序視為有限自動(dòng)機(jī)。

每臺(tái)自動(dòng)機(jī)可以一次接受一個(gè)“步驟”,程序的執(zhí)行分解為多帶帶的步驟。

這些步驟通過(guò)改變代表“狀態(tài)”的變量的值來(lái)相互溝通。

程序的控制流程由該變量的值決定。

應(yīng)用程序設(shè)計(jì)方法應(yīng)與控制系統(tǒng)(Automata System)的設(shè)計(jì)類(lèi)似。
核心思想:將程序看作是一個(gè)有限狀態(tài)自動(dòng)機(jī),側(cè)重于對(duì)“狀態(tài)”和“狀態(tài)轉(zhuǎn)換”的抽象和編程

程序的執(zhí)行被分解為一組自動(dòng)執(zhí)行的步驟

每個(gè)步驟實(shí)際上是一個(gè)代碼段的執(zhí)行(所有步驟都相同),它有一個(gè)入口點(diǎn)。 這樣的部分可以是功能或其他例程,或者只是一個(gè)循環(huán)體。

各步驟之間的通訊通過(guò)“狀態(tài)變量”進(jìn)行

在任何兩個(gè)步驟之間,程序不能有其狀態(tài)的隱式分量,例如本地(堆棧)變量值,返回地址,當(dāng)前指令指針等。

在進(jìn)入自動(dòng)機(jī)步驟的任何兩個(gè)時(shí)刻取得的整個(gè)程序的狀態(tài)只能在被認(rèn)為是自動(dòng)機(jī)狀態(tài)的變量值中有所不同。

如何實(shí)施?

基于自動(dòng)機(jī)的代碼的整個(gè)執(zhí)行過(guò)程都是自動(dòng)機(jī)步驟的一個(gè)(可能是顯式的)循環(huán)。

“狀態(tài)”變量可以是簡(jiǎn)單的枚舉數(shù)據(jù)類(lèi)型,但可以使用更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

一種常見(jiàn)的技術(shù)是創(chuàng)建一個(gè)狀態(tài)轉(zhuǎn)換表,一個(gè)包含表示每種可能狀態(tài)的行的二維數(shù)組,以及表示輸入?yún)?shù)的列。

行和列滿足的表格的值是在符合兩個(gè)條件的情況下機(jī)器應(yīng)轉(zhuǎn)換到的下一個(gè)狀態(tài)。

應(yīng)用領(lǐng)域

高可靠性系統(tǒng)

軍事應(yīng)用

航空航天工業(yè)

汽車(chē)行業(yè)

嵌入式系統(tǒng)
移動(dòng)系統(tǒng)
可視化系統(tǒng)
Web應(yīng)用程序
客戶端服務(wù)器應(yīng)用程序

(2) State Pattern

狀態(tài)模式 (behavioral pattern)

假設(shè)一個(gè)對(duì)象總是處于幾個(gè)已知狀態(tài)之一
對(duì)象所處的狀態(tài)決定了幾種方法的行為
可以在每種方法中使用if / case語(yǔ)句
更好的解決方案:狀態(tài)模式
有一個(gè)狀態(tài)對(duì)象的引用

通常,狀態(tài)對(duì)象不包含任何字段

更改狀態(tài):更改狀態(tài)對(duì)象

方法委托給狀態(tài)對(duì)象

狀態(tài)模式注釋
可以為每個(gè)狀態(tài)類(lèi)的實(shí)例使用單例

狀態(tài)對(duì)象不封裝狀態(tài),所以可以共享 - 不可變

輕松添加新的狀態(tài)

新?tīng)顟B(tài)可以擴(kuò)展其他狀態(tài)

僅覆蓋選定的功能

(3) Memento Pattern

備忘錄模式 (behavioral)

意圖

在不違反封裝的情況下,捕獲并外部化對(duì)象的內(nèi)部狀態(tài),以便稍后可以將對(duì)象返回到此狀態(tài)。

封裝“檢查點(diǎn)”功能的魔術(shù)餅干(cookie)。

促進(jìn)撤消或回滾到完整的對(duì)象狀態(tài)。

問(wèn)題:需要將對(duì)象恢復(fù)到以前的狀態(tài)(例如“撤銷(xiāo)”或“回滾”操作)。
記住對(duì)象的歷史狀態(tài),以便于“回滾”

備忘錄設(shè)計(jì)模式定義了三種不同的角色:

發(fā)起者 - 知道如何保存自己的對(duì)象。需要“備忘”的類(lèi)

看守者 - 知道發(fā)起者需要保存和恢復(fù)的原因和時(shí)間的對(duì)象。添加發(fā)起者的備忘記錄和恢復(fù)

備忘錄 - 由發(fā)起人撰寫(xiě)和閱讀的鎖盒,由看守人管理。備忘錄,記錄發(fā)起者對(duì)象的歷史狀態(tài)

*表驅(qū)動(dòng)的構(gòu)造

什么是“表驅(qū)動(dòng)”?

表驅(qū)動(dòng)方法是一種使用表來(lái)查詢信息而不是使用邏輯語(yǔ)句(例如if-else和switch-case)的模式。
在簡(jiǎn)單情況下,使用邏輯語(yǔ)句更快更容易,但隨著邏輯鏈變得更復(fù)雜,表驅(qū)動(dòng)的代碼:

比復(fù)雜的邏輯簡(jiǎn)單

更容易修改

更高效

表驅(qū)動(dòng)編程的核心思想:將代碼中復(fù)雜的if-else和switch-case語(yǔ)句從代碼中分離出來(lái),通過(guò)“查表”的方式完成,從而提高可維護(hù)性

查找東西的方法

? 直接訪問(wèn)
? 索引訪問(wèn)
? 階梯訪問(wèn)

選擇其中之一取決于數(shù)據(jù)的性質(zhì)以及數(shù)據(jù)域的大小。

(1) 直接訪問(wèn)表

簡(jiǎn)單

您只是通過(guò)一個(gè)或多個(gè)索引“查找事物”。

與所有查找表一樣,直接訪問(wèn)表取代了更復(fù)雜的邏輯控制結(jié)構(gòu)。

他們是“直接進(jìn)入”的,因?yàn)槟悴槐靥^(guò)任何復(fù)雜的循環(huán)來(lái)找到你想要的信息。

(2) 索引訪問(wèn)表

有時(shí)直接索引是一個(gè)問(wèn)題,特別是如果可能的值域很大。
例如,如果您想使用產(chǎn)品ID(8位數(shù)字),并制作一張映射200個(gè)產(chǎn)品的表格。

查找索引與直接索引

索引元素很?。ㄕ麛?shù)),值可以有效地大(只有你需要的那么多),比如字符串(名字,描述,錯(cuò)誤信息等)。
多個(gè)索引可以訪問(wèn)相同的數(shù)據(jù)(員工信息可以按名稱(chēng),聘用日期,出售等進(jìn)行映射)
可維護(hù) - 從應(yīng)用程序界面隔離查找方法。

(3) 階梯訪問(wèn)表

表格中的條目對(duì)數(shù)據(jù)范圍有效,而不適用于不同的數(shù)據(jù)點(diǎn)

關(guān)鍵點(diǎn)

表格提供了復(fù)雜邏輯和繼承結(jié)構(gòu)的替代方案。 如果您發(fā)現(xiàn)程序的邏輯或繼承樹(shù)讓您感到困惑,那么問(wèn)問(wèn)自己是否可以通過(guò)查找表進(jìn)行簡(jiǎn)化。

使用表格的一個(gè)關(guān)鍵考慮因素是決定如何訪問(wèn)表格。 您可以通過(guò)直接訪問(wèn),索引訪問(wèn)或階梯訪問(wèn)來(lái)訪問(wèn)表。

使用表格的另一個(gè)關(guān)鍵考慮因素是決定放入表格的具體內(nèi)容。

語(yǔ)法驅(qū)動(dòng)的構(gòu)造(Grammar-based construction)

基于語(yǔ)法的構(gòu)建目標(biāo)

理解語(yǔ)法生成和正則表達(dá)式操作符的思想
能夠讀取語(yǔ)法或正則表達(dá)式,并確定它是否匹配一系列字符
能夠編寫(xiě)語(yǔ)法或正則表達(dá)式來(lái)匹配一組字符序列并將其解析為數(shù)據(jù)結(jié)構(gòu)

基于字符串/流的I / O

某些程序模塊以字節(jié)序列或字符序列的形式輸入或輸出輸出,當(dāng)它存儲(chǔ)在內(nèi)存中時(shí)稱(chēng)為字符串,或者在流入或流出模塊時(shí)稱(chēng)為字符串。 有一類(lèi)應(yīng)用,從外部讀取文本數(shù)據(jù),在應(yīng)用中做進(jìn)一步處理。

具體來(lái)說(shuō),一個(gè)字節(jié)或字符序列可能是:

磁盤(pán)上的文件,這種情況下,規(guī)范稱(chēng)為文件格式,程序需讀取文件并從中抽取正確的內(nèi)容

通過(guò)網(wǎng)絡(luò)發(fā)送的消息,在這種情況下,規(guī)范是有線協(xié)議從網(wǎng)絡(luò)上傳輸過(guò)來(lái)的消息,遵循特定的協(xié)議

用戶在控制臺(tái)上鍵入的命令,在這種情況下,規(guī)范是命令行界面,用戶在命令行輸入的指令,遵循特定的格式

存儲(chǔ)在內(nèi)存中的字符串,也有格式需要

語(yǔ)法的概念

對(duì)于這些類(lèi)型的序列,語(yǔ)法的概念是設(shè)計(jì)的一個(gè)好選擇:

它不僅可以幫助區(qū)分合法序列和非法序列,還可以將序列解析為程序可以使用的數(shù)據(jù)結(jié)構(gòu)。 使用語(yǔ)法判斷字符串是否合法,并解析成程序里使用的數(shù)據(jù)結(jié)構(gòu)

從語(yǔ)法產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)通常是遞歸數(shù)據(jù)類(lèi)型。通常是遞歸的數(shù)據(jù)結(jié)構(gòu)

正則表達(dá)式

這是一個(gè)廣泛使用的工具,用于許多字符串處理任務(wù),需要反匯編字符串,從中提取信息或進(jìn)行轉(zhuǎn)換。

解析器生成器是一種將語(yǔ)法自動(dòng)轉(zhuǎn)換為該語(yǔ)法的解析器的工具。 根據(jù)語(yǔ)法生成它的解析器,用于后續(xù)的解析

(1) 語(yǔ)法的組成部分

終結(jié):語(yǔ)法中的文字串

為了描述一串符號(hào),無(wú)論它們是字節(jié),字符還是其他類(lèi)型的從固定集合中抽取的符號(hào),我們都使用稱(chēng)為語(yǔ)法的緊湊表示法。

語(yǔ)法定義了一組字符串。用語(yǔ)法定義一個(gè)“字符串”

例如,URL的語(yǔ)法將指定HTTP協(xié)議中合法URL的一組字符串。

文法中的文字被稱(chēng)為終結(jié)節(jié)點(diǎn),葉節(jié)點(diǎn)

它們被稱(chēng)為終結(jié),因?yàn)樗鼈兪谴碜址Y(jié)構(gòu)的解析樹(shù)的葉子。語(yǔ)法解析樹(shù)的葉子節(jié)點(diǎn)

他們沒(méi)有孩子,不能再進(jìn)一步擴(kuò)大。 無(wú)法再往下擴(kuò)展

我們通常用引號(hào)將終結(jié)寫(xiě)入,如"http"或":"。 通常表示為字符串

語(yǔ)法中的非終結(jié)者與生產(chǎn)者

一個(gè)語(yǔ)法由一組產(chǎn)品描述,每個(gè)產(chǎn)品定義一個(gè)非終結(jié)非終止節(jié)點(diǎn)

非終結(jié)符就像一個(gè)變量,它表示一組字符串,而生成則表示該變量根據(jù)其他變量(非終結(jié)符),運(yùn)算符和常量(終結(jié))的定義。 遵循特定規(guī)則,利用操作符,終止節(jié)點(diǎn)和其他非終止節(jié)點(diǎn),構(gòu)造新的字符串

非終結(jié)符是表示字符串的樹(shù)的內(nèi)部節(jié)點(diǎn)。

語(yǔ)法中的生產(chǎn)具有這種形式

非終結(jié)符:: =終結(jié),非終結(jié)符和運(yùn)算符的表達(dá)式

語(yǔ)法的非終結(jié)點(diǎn)之一被指定為根。

語(yǔ)法識(shí)別的字符串集合是匹配根非終結(jié)符的字符串。

這個(gè)非終結(jié)者通常被稱(chēng)為root或start。根節(jié)點(diǎn)

(2) 語(yǔ)法中的操作符

三個(gè)基本的語(yǔ)法運(yùn)算符

生產(chǎn)表達(dá)中最重要的三個(gè)操作是:

連接,不是由一個(gè)符號(hào)表示,而是一個(gè)空格:x :: = y z an x是一個(gè)y,后跟一個(gè)z

重復(fù),用表示:x :: = y x是零或更多y

聯(lián)合,也稱(chēng)為選擇,由|:x :: = y |表示 z an x是y或z

(5) 正則語(yǔ)法和正則表達(dá)式

正則語(yǔ)法

正則語(yǔ)法有一個(gè)特殊的性質(zhì):通過(guò)用右端代替每個(gè)非終結(jié)符(除了根結(jié)尾之外),可以將它縮減為單根生成,只有終結(jié)和操作符在右側(cè)。
正則語(yǔ)法:簡(jiǎn)化之后可以表達(dá)為一個(gè)產(chǎn)生式而不包含任何非終止節(jié)點(diǎn)

正則表達(dá)式(正則表達(dá)式)

終結(jié)和操作符的簡(jiǎn)化表達(dá)式可以用更緊湊的形式寫(xiě)成,稱(chēng)為正則表達(dá)式。
正則表達(dá)式避免了終結(jié)周?chē)囊?hào)以及終結(jié)和運(yùn)算符之間的空格,因此它只包含終結(jié)字符,用于分組的括號(hào)和運(yùn)算符字符。去除引號(hào)和空格,從而表達(dá)更簡(jiǎn)潔(更難懂)

正則表達(dá)式比原始語(yǔ)法的可讀性要低得多,因?yàn)樗鄙儆涗浢總€(gè)子表達(dá)式意義的非終結(jié)符名稱(chēng)。

但是一個(gè)正則表達(dá)式的實(shí)現(xiàn)很快,并且有很多支持正則表達(dá)式的編程語(yǔ)言的庫(kù)。

正則表達(dá)式中的一些特殊運(yùn)算符

. 任何單個(gè)字符
d任意數(shù)字,與[0-9]相同
是任何空格字符,包括空格,制表符,換行符
w任何單詞字符,包括字母和數(shù)字
,(,), *, +,...轉(zhuǎn)義一個(gè)操作符或特殊字符,以便它按字面順序匹配

上下文無(wú)關(guān)文法

通常,可以用我們的語(yǔ)法系統(tǒng)表達(dá)的語(yǔ)言稱(chēng)為上下文無(wú)關(guān)的。

并非所有的上下文無(wú)關(guān)語(yǔ)言也是正則的; 也就是說(shuō),有些語(yǔ)法不能簡(jiǎn)化為單一的非遞歸生成。

HTML語(yǔ)法是上下文無(wú)關(guān)的,但不是正則的。

大多數(shù)編程語(yǔ)言的語(yǔ)法也是無(wú)上下文的。
一般來(lái)說(shuō),任何具有嵌套結(jié)構(gòu)的語(yǔ)言(如嵌套括號(hào)或大括號(hào))都是上下文無(wú)關(guān)的,但不是正則的。

(6) *解析器

語(yǔ)法,解析器和解析器生成器
目標(biāo):

能夠?qū)⒄Z(yǔ)法與解析器生成器結(jié)合使用,將字符序列解析為解析樹(shù)

能夠?qū)⒎治鰳?shù)轉(zhuǎn)換為有用的數(shù)據(jù)類(lèi)型

解析器將輸入文本轉(zhuǎn)為解析樹(shù)

解析器需要一系列字符并嘗試將該序列與語(yǔ)法進(jìn)行匹配。 解析器:輸入一段文本,與特定的語(yǔ)法規(guī)則建立匹配,輸出結(jié)果
解析器通常會(huì)生成一個(gè)解析樹(shù),該解析樹(shù)顯示如何將語(yǔ)法生成擴(kuò)展為與字符序列匹配的句子。 解析器:將文本轉(zhuǎn)化為解析樹(shù)

解析樹(shù)的根是語(yǔ)法的起始非終結(jié)符。

解析樹(shù)的每個(gè)節(jié)點(diǎn)都擴(kuò)展為語(yǔ)法的一個(gè)生成。

解析的最后一步是對(duì)這個(gè)分析樹(shù)做一些有用的工作。 利用產(chǎn)生的分析樹(shù),進(jìn)行下一步的處理
表示語(yǔ)言表達(dá)式的遞歸抽象數(shù)據(jù)類(lèi)型稱(chēng)為抽象語(yǔ)法樹(shù)(AST)。

解析器生成器根據(jù)語(yǔ)法定義生成解析器

解析器生成器是一種讀取語(yǔ)法規(guī)范并將其轉(zhuǎn)換為可識(shí)別語(yǔ)法匹配的Java程序的工具。
更廣泛地:

解析器生成器是一種編程工具,它根據(jù)某種形式的語(yǔ)言形式描述創(chuàng)建解析器,解釋器或編譯器。

輸入可能是一個(gè)文本文件,其中包含用BNF或EBNF編寫(xiě)的定義編程語(yǔ)言語(yǔ)法的語(yǔ)法。 - 輸出是語(yǔ)法分析器的一些源代碼。

Backus Normal Form(BNF)巴克斯范式

1959年6月,Backus Normal Form(BNF)首次提出,以遞歸形式描述語(yǔ)言的各種成分,凡遵守其規(guī)則的程序就可保證語(yǔ)法上的正確性。

經(jīng)過(guò)Peter Naur的改進(jìn)與完善以及Niklaus Wirth的擴(kuò)充,形成了EBNF(擴(kuò)展BNF),也就是目前使用的BNF。

經(jīng)Donald Knuth的建議,BNF中的N變成了Naur(Backus-Naur Form)。

Grammar定義語(yǔ)法規(guī)則(BNF格式的文本),Parser generator根據(jù) 語(yǔ)法規(guī)則產(chǎn)生一個(gè)parser,用戶利用parser來(lái)解析文本,看其是否符 合語(yǔ)法定義并對(duì)其做各種處理(例如轉(zhuǎn)成parse tree)

(7) 在Java中使用正則表達(dá)式

用于正則表達(dá)式處理的java.util.regex

java.util.regex包主要由三個(gè)類(lèi)組成:

一個(gè)Pattern對(duì)象是一個(gè)正則表達(dá)式的編譯后的表示。 Pattern類(lèi)不提供公共構(gòu)造函數(shù)。 要?jiǎng)?chuàng)建一個(gè)模式,你必須首先調(diào)用其公共靜態(tài)編譯方法之一,然后返回一個(gè)Pattern對(duì)象。 這些方法接受一個(gè)正則表達(dá)式作為第一個(gè)參數(shù)。模式是對(duì)正則表達(dá)式的正則表達(dá)式進(jìn)行編譯之后得到的結(jié)果

匹配對(duì)象是解釋模式并對(duì)輸入字符串執(zhí)行匹配操作的引擎。 像Pattern類(lèi)一樣,Matcher沒(méi)有定義公共構(gòu)造函數(shù)。 您通過(guò)調(diào)用Pattern對(duì)象上的匹配器方法來(lái)獲得Matcher對(duì)象。 Matcher:利用Pattern對(duì)輸入字符串進(jìn)行解析

PatternSyntaxException對(duì)象是指示正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤的未經(jīng)檢查的異常。

正則表達(dá)式在編程語(yǔ)言中非常有用。

在Java中,可以使用正則表達(dá)式來(lái)處理字符串(例如String.split,String.matches,java.util.regex.Pattern)。

它們作為現(xiàn)代腳本語(yǔ)言(如Python,Ruby和Javascript)的一流功能而內(nèi)置,您可以在許多文本編輯器中將它們用于查找和替換。

(8)* Interpreter

解釋器模式

解釋器模式提供了評(píng)估語(yǔ)言語(yǔ)法或表達(dá)的方法。
意圖

給定一種語(yǔ)言,為其語(yǔ)法定義一個(gè)表示法,以及一個(gè)使用表示法來(lái)解釋語(yǔ)言句子的解釋器。 給定一種語(yǔ)法,定義該語(yǔ)法的程序內(nèi)部表示,形成該語(yǔ)法的解釋器,將遵循語(yǔ)法規(guī)則的文本解釋成程序內(nèi)部的表示(例如一組對(duì)象)

將一個(gè)領(lǐng)域映射到一種語(yǔ)言,將語(yǔ)言映射到一種語(yǔ)法,將語(yǔ)法映射為一種等級(jí)面向?qū)ο笤O(shè)計(jì)。解釋語(yǔ)法的“引擎”:遵循語(yǔ)法的文本?OO表示

用于定義語(yǔ)法,標(biāo)記輸入并存儲(chǔ)它。

實(shí)施

它使用復(fù)合模式來(lái)表示語(yǔ)法。

因?yàn)檎Z(yǔ)法通常形成樹(shù)結(jié)構(gòu),故使用復(fù)合模式來(lái)表達(dá)遵循語(yǔ)法的內(nèi)容。

它定義了行為,而復(fù)合只定義了結(jié)構(gòu)。

針對(duì)該層次化樹(shù)形結(jié)構(gòu),定義了一組行為來(lái)處理結(jié)構(gòu)中的不同類(lèi)型節(jié)點(diǎn)

解釋器與語(yǔ)法+解析器
語(yǔ)法+解析器

語(yǔ)法由BNF等形式定義

解析器讀取用戶輸入的待解析的文本,判定其是否與語(yǔ)法匹配,并轉(zhuǎn)為符合語(yǔ)法的解析樹(shù),交給其他功能做后續(xù)處理 - 可用于高度復(fù)雜的語(yǔ)法規(guī)則

解釋器模式

語(yǔ)法由程序員手工定義為一組接口/類(lèi)及其之間的關(guān)系,對(duì)語(yǔ)法的解釋?zhuān)唇馕銎鳎┯纱私M的類(lèi)的內(nèi)部操作(Interpret())負(fù)責(zé)

每條語(yǔ)法規(guī)則(生產(chǎn))都要定義相應(yīng)的類(lèi) - 相當(dāng)于開(kāi)發(fā)一個(gè)簡(jiǎn)單的解析器 - 用戶使用的時(shí)候,調(diào)用這個(gè)類(lèi)類(lèi)完成對(duì)輸入文本的解釋?zhuān)ㄟ@里的“解釋”,其實(shí)相當(dāng)于 “翻譯”) - 只適用于簡(jiǎn)單的語(yǔ)法規(guī)則,過(guò)于復(fù)雜的語(yǔ)法就需要引入大量的類(lèi)

總結(jié)

機(jī)器處理的文本語(yǔ)言在計(jì)算機(jī)科學(xué)中無(wú)處不在。
語(yǔ)法是描述這種語(yǔ)言的最流行的形式
正則表達(dá)式是語(yǔ)法的一個(gè)重要子類(lèi),可以在不遞歸的情況下表達(dá)。

減少錯(cuò)誤保證安全

語(yǔ)法和正則表達(dá)式是字符串和流的聲明性規(guī)范,可以由庫(kù)和工具直接使用。

這些規(guī)范通常比手工分析代碼更簡(jiǎn)單,更直接,更不容易出錯(cuò)。

容易明白

語(yǔ)法以比手寫(xiě)解析代碼更易于理解的形式捕獲序列的形狀。

正則表達(dá)式,唉,往往不易理解,因?yàn)樗鼈兪强赡苁且粋€(gè)更容易理解的正則語(yǔ)法的簡(jiǎn)化形式。

準(zhǔn)備好改變

語(yǔ)法可以很容易地編輯,但不幸的是,正則表達(dá)式很難改變,因?yàn)閺?fù)雜的正則表達(dá)式是神秘而難以理解的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71344.html

相關(guān)文章

  • 6可維護(hù)性軟件構(gòu)建方法 6.1可維護(hù)性的度量和構(gòu)造原則

    摘要:設(shè)計(jì)方案的容易改變這就是所謂的軟件構(gòu)建的可維護(hù)性,可擴(kuò)展性和靈活性。這也可能表明類(lèi)型或方法可能難以維護(hù)。基于源代碼中不同運(yùn)算符和操作數(shù)的數(shù)量的合成度量。對(duì)修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護(hù)和演變可維護(hù)性度量模塊化設(shè)計(jì)和模塊化原則OO設(shè)計(jì)原則:SOLIDOO設(shè)計(jì)原則:GRASP總結(jié) 軟件維護(hù)和演變 什么是軟件維護(hù)? 軟件工程中的軟件維護(hù)是交付后修改軟件產(chǎn)品以糾正故障...

    chanjarster 評(píng)論0 收藏0
  • 5:可復(fù)用性的軟件構(gòu)建方法 5.1可復(fù)用性的度量,形態(tài)和外部觀察

    摘要:大綱什么是軟件復(fù)用如何衡量可復(fù)用性可復(fù)用組件的級(jí)別和形態(tài)源代碼級(jí)別復(fù)用模塊級(jí)別的復(fù)用類(lèi)抽象類(lèi)接口庫(kù)級(jí)別的復(fù)用包系統(tǒng)級(jí)別的復(fù)用框架對(duì)可復(fù)用性的外部觀察類(lèi)型變化例行分組實(shí)施變更代表獨(dú)立分解常見(jiàn)行為總結(jié)什么是軟件復(fù)用軟件復(fù)用軟件復(fù)用是使用現(xiàn)有軟件 大綱 什么是軟件復(fù)用?如何衡量可復(fù)用性?可復(fù)用組件的級(jí)別和形態(tài) 源代碼級(jí)別復(fù)用 模塊級(jí)別的復(fù)用:類(lèi)/抽象類(lèi)/接口 庫(kù)級(jí)別的復(fù)用:API /包 系...

    mengera88 評(píng)論0 收藏0
  • 6可維護(hù)性軟件構(gòu)建方法 6.2可維護(hù)性設(shè)計(jì)模式

    摘要:抽象工廠模式將具有共同主題的對(duì)象工廠分組。對(duì)可重用性和可維護(hù)性設(shè)計(jì)模式的高層考慮創(chuàng)造性模式工廠方法模式也稱(chēng)為虛擬構(gòu)造器意圖定義一個(gè)用于創(chuàng)建對(duì)象的接口,但讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)。 大綱 創(chuàng)造性模式 工廠方法模式創(chuàng)建對(duì)象而不指定要?jiǎng)?chuàng)建的確切類(lèi)。 抽象工廠模式將具有共同主題的對(duì)象工廠分組。 Builder模式通過(guò)分離構(gòu)造和表示來(lái)構(gòu)造復(fù)雜的對(duì)象。 結(jié)構(gòu)模式 Bridge將抽象從其實(shí)現(xiàn)中分...

    VioletJack 評(píng)論0 收藏0
  • 2軟件構(gòu)建的過(guò)程和工具 2.2軟件構(gòu)建的過(guò)程,系統(tǒng)和工具

    摘要:建模語(yǔ)言建模語(yǔ)言是可用于表達(dá)信息或知識(shí)或系統(tǒng)的任何人造語(yǔ)言,該結(jié)構(gòu)由一組一致的規(guī)則定義,目標(biāo)是可視化,推理,驗(yàn)證和傳達(dá)系統(tǒng)設(shè)計(jì)。將這些文件安排到不同的地方稱(chēng)為源代碼樹(shù)。源代碼樹(shù)的結(jié)構(gòu)通常反映了軟件的體系結(jié)構(gòu)。 大綱 軟件構(gòu)建的一般過(guò)程: 編程/重構(gòu) 審查和靜態(tài)代碼分析 調(diào)試(傾倒和記錄)和測(cè)試 動(dòng)態(tài)代碼分析/分析 軟件構(gòu)建的狹義過(guò)程(Build): 構(gòu)建系統(tǒng):組件和過(guò)程 構(gòu)建變體...

    godiscoder 評(píng)論0 收藏0
  • 5:可重用性的軟件構(gòu)建方法 5.3面向復(fù)用的設(shè)計(jì)模式

    摘要:共性的步驟在抽象類(lèi)內(nèi)公共實(shí)現(xiàn),差異化的步驟在各個(gè)子類(lèi)中實(shí)現(xiàn)子類(lèi)為每個(gè)步驟提供不同的實(shí)現(xiàn)。模板方法將算法的骨架定義為抽象類(lèi),允許其子類(lèi)提供具體行為。迭代器依次訪問(wèn)對(duì)象的元素而不暴露其基礎(chǔ)表示。 大綱 結(jié)構(gòu)模式 Adapter允許具有不兼容接口的類(lèi)通過(guò)將自己的接口包裝到已有類(lèi)的接口中來(lái)一起工作。 Decorator動(dòng)態(tài)添加/覆蓋對(duì)象的現(xiàn)有方法中的行為。 Facade為大量代碼提供簡(jiǎn)化的界...

    superPershing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<