摘要:遵循特定規(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)用程序
狀態(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)用程序界面隔離查找方法。
表格中的條目對(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)的,但不是正則的。
語(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
摘要:設(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)品以糾正故障...
摘要:大綱什么是軟件復(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 /包 系...
摘要:抽象工廠模式將具有共同主題的對(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)中分...
摘要:建模語(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)建變體...
摘要:共性的步驟在抽象類(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)化的界...
閱讀 1269·2021-11-19 09:40
閱讀 3128·2021-11-02 14:47
閱讀 3101·2021-10-11 10:58
閱讀 3224·2019-08-30 15:54
閱讀 2678·2019-08-30 12:50
閱讀 1732·2019-08-29 16:54
閱讀 473·2019-08-29 15:38
閱讀 1243·2019-08-29 15:19