專(zhuān)利名稱(chēng)::硬件加速器個(gè)性編譯器的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明一般涉及用于控制通用計(jì)算機(jī)操作的應(yīng)用和文檔處理,并且尤其涉及對(duì)給定但任意的語(yǔ)言或格式的應(yīng)用程序、文檔和/或其它邏輯符號(hào)序列執(zhí)行語(yǔ)法分析操作。
背景技術(shù):
:近些年來(lái),計(jì)算機(jī)之間的數(shù)字通信以及將計(jì)算機(jī)連接到網(wǎng)絡(luò)中的領(lǐng)域得到了迅速發(fā)展,它在許多方面都類(lèi)似于前些年個(gè)人計(jì)算機(jī)的激增。遠(yuǎn)程處理互連性和可能性的這種增加大大提高了這種網(wǎng)絡(luò)化系統(tǒng)中個(gè)體計(jì)算機(jī)的有效能力和功能性。然而,當(dāng)計(jì)算機(jī)投入使用時(shí),個(gè)體計(jì)算機(jī)和系統(tǒng)的使用多樣性、它們用戶(hù)的定位以及目前技術(shù)水平造成了單機(jī)和它們操作系統(tǒng)的能力和配置的高度多樣性,單機(jī)和它們操作系統(tǒng)共同被稱(chēng)為“平臺(tái)”,這些平臺(tái)在某種程度上、尤其是在操作系統(tǒng)和編程語(yǔ)言級(jí)一般互不兼容。平臺(tái)特征的這種不兼容性,以及同時(shí)對(duì)通信及遠(yuǎn)程處理能力和用于支持它的足夠兼容度的要求,導(dǎo)致了面向?qū)ο缶幊?面向?qū)ο缶幊烫峁┮环N通過(guò)實(shí)體、屬性和關(guān)系的參照系統(tǒng)將應(yīng)用及數(shù)據(jù)編譯為一組不同程度的一般化模塊的概念)以及用于實(shí)施面向?qū)ο缶幊痰脑S多編程語(yǔ)言的發(fā)展??蓴U(kuò)展標(biāo)記語(yǔ)言(XMLTM)就是這樣一種語(yǔ)言,XML已得到廣泛使用,并且可以作為文檔、在任意組成和體系結(jié)構(gòu)的網(wǎng)絡(luò)上傳輸。在這種語(yǔ)言中,某些字符串對(duì)應(yīng)于某些命令或標(biāo)識(shí),包括某些專(zhuān)用字符和其它重要數(shù)據(jù)(共同被稱(chēng)為控制字),這些專(zhuān)用字符和重要數(shù)據(jù)允許數(shù)據(jù)或操作實(shí)際上識(shí)別它們自己,使得此后它們可以被處理為“對(duì)象”,以致關(guān)聯(lián)的數(shù)據(jù)和命令可以被翻譯成不同語(yǔ)言不同應(yīng)用的適當(dāng)格式和命令,以便產(chǎn)生足以支持給定機(jī)器上預(yù)期處理的各個(gè)連接平臺(tái)兼容度。這些字符串的檢測(cè)是通過(guò)一種被稱(chēng)為語(yǔ)法分析的操作來(lái)執(zhí)行的,語(yǔ)法分析操作類(lèi)似于更常規(guī)的把諸如句子的表達(dá)式的語(yǔ)法分解為其組成部分,并在語(yǔ)法上描述它們的用法。即使在其它可以被計(jì)算機(jī)搜索或相反被計(jì)算機(jī)處理的計(jì)算機(jī)編程語(yǔ)言和文檔中,控制字也將限于有限的但可能很多,從而允許的符號(hào)序列將類(lèi)似地被限制為內(nèi)容的事件和語(yǔ)言的語(yǔ)法。此外,用于識(shí)別文檔內(nèi)容的文檔語(yǔ)法分析已經(jīng)證明是,一種通過(guò)檢測(cè)可能代表攻擊、未授權(quán)訪(fǎng)問(wèn)或其它可能安全性缺口的控制字來(lái)提供處理器和網(wǎng)絡(luò)中安全性的重要工具。另外,或多或少具有復(fù)雜功能序列的其它許多設(shè)備如電話(huà)和/或診斷設(shè)備,響應(yīng)取決于先前功能序列的類(lèi)似刺激或輸入,采用有限狀態(tài)機(jī)來(lái)實(shí)現(xiàn)不同功能,而實(shí)際上許多這種設(shè)備的響應(yīng)定制變得越來(lái)越需要,但是受產(chǎn)生與輸入的預(yù)期響應(yīng)序列相對(duì)應(yīng)的狀態(tài)表的困難的限制。例如,當(dāng)對(duì)XMLTM文檔進(jìn)行語(yǔ)法分析時(shí),中央處理器(CPU)執(zhí)行時(shí)間的一大部分,并且可能主要部分,都花費(fèi)在遍歷文檔、以便搜索如相對(duì)于正在處理的特殊XMLTM標(biāo)準(zhǔn)而定義的控制字、專(zhuān)用字符和其它重要數(shù)據(jù)上。典型地這是通過(guò)軟件來(lái)執(zhí)行的,該軟件查詢(xún)每個(gè)字符,并確定每個(gè)字符是否屬于所關(guān)心的一組預(yù)定義串,例如包括以下“<command>”、“<data=dataword>”、“<endcommand>”等的一組字符串。如果檢測(cè)到任何一個(gè)目標(biāo)串,就將標(biāo)記和指向文檔中標(biāo)記開(kāi)始位置和標(biāo)記長(zhǎng)度的指針一起保存。這些標(biāo)記被累積,直到整個(gè)文檔都被進(jìn)行了語(yǔ)法分析為止。對(duì)文檔進(jìn)行語(yǔ)法分析的常規(guī)方法是,用軟件來(lái)實(shí)施基于表的有限狀態(tài)機(jī)(FSM),以搜索所關(guān)心的這些串。狀態(tài)表駐留在存儲(chǔ)器中,并且被設(shè)計(jì)用于搜索文檔中所關(guān)心的特定模式。當(dāng)前狀態(tài)用作狀態(tài)表的基地址,并且輸入字符的ASCII表示是表的索引。例如,假定狀態(tài)機(jī)處于狀態(tài)0(0)、并且第一個(gè)輸入字符是ASCII值02,則狀態(tài)項(xiàng)的絕對(duì)地址將是基地址(狀態(tài)0)與索引/ASCII字符(02)的和/連接。FSM以CPU從存儲(chǔ)器中取出輸入文檔的第一字符而開(kāi)始。然后,CPU將絕對(duì)地址構(gòu)造到存儲(chǔ)器中與初始化/當(dāng)前狀態(tài)和輸入字符相對(duì)應(yīng)的狀態(tài)表中,然后從該狀態(tài)表取出狀態(tài)數(shù)據(jù)?;谒祷氐臓顟B(tài)數(shù)據(jù),如果不同(表示字符與所關(guān)心的串的第一個(gè)字符相對(duì)應(yīng)),則CPU將當(dāng)前狀態(tài)更新為新值,并執(zhí)行狀態(tài)數(shù)據(jù)中指示的其它任何行動(dòng)(例如,如果單一字符是專(zhuān)用字符,或者如果一旦進(jìn)一步重復(fù)上述操作,就發(fā)現(xiàn)當(dāng)前字符是所關(guān)心的串的最后一個(gè)字符,則發(fā)出標(biāo)記或中斷)。重復(fù)上述過(guò)程,并且當(dāng)找到所關(guān)心的串的后續(xù)字符時(shí),改變狀態(tài)。即,如果初始字符被認(rèn)為是所關(guān)心的串的初始字符,則FSM的狀態(tài)可以前進(jìn)到新?tīng)顟B(tài)(例如,從初始狀態(tài)0到狀態(tài)1)。如果字符不是所關(guān)心的,則狀態(tài)機(jī)將(一般)通過(guò)在從狀態(tài)表地址返回的狀態(tài)表項(xiàng)目中指定相同的狀態(tài)(例如狀態(tài)0)(或者通過(guò)不命令狀態(tài)更新),來(lái)保持相同狀態(tài)??赡艿男袆?dòng)包括但不限于,設(shè)置中斷、存儲(chǔ)標(biāo)記以及更新指針。然后,對(duì)后面的字符重復(fù)該過(guò)程。應(yīng)該注意,當(dāng)正在跟蹤所關(guān)心的串、并且FSM處于非0狀態(tài)(表示還沒(méi)有找到所關(guān)心的串或當(dāng)前正在跟隨所關(guān)心的串的其它狀態(tài)),可以找到與當(dāng)前串不一致,但是是另一個(gè)關(guān)心的串的初始字符的字符。在這種情況下,狀態(tài)表項(xiàng)目將指示適當(dāng)?shù)男袆?dòng),以便指出和識(shí)別先前跟蹤的串片段或部分,并跟蹤可能的新的所關(guān)心串,直到完全識(shí)別新串,或發(fā)現(xiàn)新串不是所關(guān)心的串為止。換句話(huà)說(shuō),所關(guān)心的串可能被嵌套,并且狀態(tài)機(jī)必須能夠在另一個(gè)關(guān)心的串內(nèi)檢測(cè)到所關(guān)心的串,等等。這可能要求CPU遍歷許多次XMLTM文檔的各部分,以便對(duì)XMLTM文檔進(jìn)行徹底的語(yǔ)法分析。然而,可以容易理解,F(xiàn)SM的狀態(tài)表必定是給定計(jì)算機(jī)語(yǔ)言及其控制字和/或語(yǔ)法及句法所特有的。也可以理解,隨著控制字和格式規(guī)則數(shù)的增大,狀態(tài)表的尺寸必定變得非常大。此外,目前通常的做法是,產(chǎn)生制定完善,且使用日益頻繁的工業(yè)標(biāo)準(zhǔn)語(yǔ)言的增強(qiáng)或擴(kuò)展版本,并且任何計(jì)算機(jī)語(yǔ)言的任何修訂或擴(kuò)展都必定需要用于對(duì)那種語(yǔ)言文檔進(jìn)行語(yǔ)法分析的FSM狀態(tài)表的相應(yīng)修訂。換句話(huà)說(shuō),由控制字給出的所有允許符號(hào)組合都必定反映在狀態(tài)表中,并且表面上控制字組和/或語(yǔ)言語(yǔ)法的少量修訂或擴(kuò)展可能需要FSM狀態(tài)表尺寸的大大修正或增加。較實(shí)際的做法是,手動(dòng)地產(chǎn)生這些狀態(tài)表、并將它們裝載到FSM可存取的存儲(chǔ)器中,以便在避免改變FSM硬件的同時(shí)適應(yīng)語(yǔ)言的改變。FSM所針對(duì)的語(yǔ)言以及FSM對(duì)那種語(yǔ)言文檔進(jìn)行語(yǔ)法分析的能力,有時(shí)被稱(chēng)為FSM的“個(gè)性(personality)”。即使?fàn)顟B(tài)表的開(kāi)發(fā)可能包括計(jì)算機(jī)語(yǔ)言或采用那種語(yǔ)言的應(yīng)用程序的大部分開(kāi)發(fā)費(fèi)用,也不存在切實(shí)可行的備選方案來(lái)替換用于改變FSM個(gè)性的手動(dòng)狀態(tài)表產(chǎn)生過(guò)程。進(jìn)一步,關(guān)于所有手動(dòng)過(guò)程,手動(dòng)產(chǎn)生狀態(tài)表常遭受錯(cuò)誤,必須在可以可靠使用FSM之前檢測(cè)并校正這些錯(cuò)誤。實(shí)際的效果是,在需要文檔語(yǔ)法分析的情況下,開(kāi)發(fā)狀態(tài)表所需的時(shí)間造成了軟件應(yīng)用和修改及其擴(kuò)展和升級(jí)的實(shí)施的延遲,即使在現(xiàn)代處理器和網(wǎng)絡(luò)環(huán)境中這種語(yǔ)言修改、擴(kuò)展和升級(jí)正變得越來(lái)越頻繁。而且,在文檔語(yǔ)法分析用作檢測(cè)可能安全缺口的工具的情況下,當(dāng)照這樣識(shí)別出指示這種可能安全缺口的串時(shí),應(yīng)該盡可能及時(shí)地將所關(guān)心的串添加到狀態(tài)表中,即使這種添加可能需要對(duì)用于這種用途的狀態(tài)表進(jìn)行大幅度修訂。更一般的是,可能需要修改FSM個(gè)性,以改變包括FSM的設(shè)備的功能的任何情況,都可能受益于產(chǎn)生相應(yīng)狀態(tài)表的困難度、成本和錯(cuò)誤靈敏度的減小。
發(fā)明內(nèi)容因此,本發(fā)明的目的是提供一種用于簡(jiǎn)單且無(wú)差錯(cuò)地改變有限狀態(tài)機(jī)狀態(tài)表的技術(shù)和設(shè)備。本發(fā)明的另一個(gè)目的是,提供一種技術(shù)和設(shè)備在不進(jìn)行硬件修改的情況下重新配置有限狀態(tài)機(jī),以及諸如包括有限狀態(tài)機(jī)的硬件語(yǔ)法分析程序加速器的裝置,以便尤其適應(yīng)計(jì)算機(jī)語(yǔ)言和應(yīng)用修改與擴(kuò)展、或全新計(jì)算機(jī)語(yǔ)言和/或應(yīng)用規(guī)范。本發(fā)明的又一目的是,提供一種用于產(chǎn)生狀態(tài)轉(zhuǎn)換表,并以諸如XMLTM的自描述數(shù)據(jù)格式記錄它們的方法和設(shè)備。為實(shí)現(xiàn)本發(fā)明這些及其它目的,本發(fā)明提供一種用于執(zhí)行方法和加載器的方法學(xué)和編譯器,該方法和加載器優(yōu)選地在諸如硬件語(yǔ)法分析程序加速器的裝備內(nèi)用軟件來(lái)實(shí)施,該硬件語(yǔ)法分析程序加速器能夠讀取規(guī)范或概括預(yù)期可執(zhí)行功能的規(guī)范,以產(chǎn)生輸出,該輸出能夠被加載到可以由諸如語(yǔ)法分析加速器的包括有限狀態(tài)機(jī)(FSM)的設(shè)備訪(fǎng)問(wèn)的存儲(chǔ)器中,以便定制FSM的個(gè)性,而該設(shè)備又包括FSM。優(yōu)選地,用形式記號(hào)如Backus-Naur形式(BNF)或其派生物、或其它正規(guī)表達(dá)式,來(lái)寫(xiě)語(yǔ)言或其它規(guī)范。基于這種輸入,根據(jù)本發(fā)明的編譯器產(chǎn)生相應(yīng)的狀態(tài)轉(zhuǎn)換,來(lái)形成包括一個(gè)或多個(gè)狀態(tài)表的狀態(tài)轉(zhuǎn)換規(guī)范。由以下參考附圖的本發(fā)明優(yōu)選實(shí)施例詳細(xì)說(shuō)明,將可以更好地理解本發(fā)明上述及其它目的、特征及優(yōu)點(diǎn),其中圖1是本發(fā)明的高級(jí)示意框圖,圖2A是代表對(duì)理解本發(fā)明有用處的狀態(tài)表的圖,圖2B是本發(fā)明一般化形式的基本操作的高級(jí)流程圖,圖3是本發(fā)明優(yōu)選實(shí)施例的操作的高級(jí)流程圖,圖4是本發(fā)明優(yōu)選實(shí)施例的高級(jí)上下文圖,圖5A、5B、5C、5D、5E、5F、5G、5H和5I顯示了分組和識(shí)別語(yǔ)法規(guī)則定義中的子表達(dá)式,以及包括圖6A和6B的圖6顯示了完全用自描述數(shù)據(jù)格式表示的輸出狀態(tài)表規(guī)范文件的例子。具體實(shí)施例方式參考附圖,尤其是參考圖1,圖1顯示了根據(jù)本發(fā)明的、且被連接以便向優(yōu)選地為硬件語(yǔ)法分析加速器的設(shè)備中的有限狀態(tài)機(jī)(FSM)提供狀態(tài)表的個(gè)性編譯器的基本形式的高級(jí)示意框圖。最初,應(yīng)該注意,可以把個(gè)性編譯器100實(shí)施為可連接到存儲(chǔ)器105的單獨(dú)設(shè)備(例如在硬件語(yǔ)法分析程序加速器離線(xiàn)的情況下),然后當(dāng)基于請(qǐng)求方式而需要時(shí),可以訪(fǎng)問(wèn)存儲(chǔ)器105以獲得狀態(tài)轉(zhuǎn)換規(guī)范,以便由加載器110將狀態(tài)轉(zhuǎn)換規(guī)范加載到FSM狀態(tài)表中、或者使?fàn)顟B(tài)轉(zhuǎn)換規(guī)范與任意設(shè)備(由虛線(xiàn)120指示)中的FSM140相結(jié)合,以部分地或完全控制該狀態(tài)轉(zhuǎn)換規(guī)范,由此允許實(shí)時(shí)地或基本上實(shí)時(shí)地更新設(shè)備的個(gè)性。應(yīng)該理解,在后一種情況下,基本上是實(shí)時(shí)的本發(fā)明操作,尤其是通過(guò)編譯語(yǔ)言語(yǔ)法規(guī)范的替換版本加速實(shí)時(shí)操作而實(shí)現(xiàn)的基本上實(shí)時(shí)的本發(fā)明操作,允許本發(fā)明始終適于在輸入流中遇到的模式和狀態(tài);由此在個(gè)性編譯器以及包括FSM的設(shè)備中提供基本學(xué)習(xí)能力。通過(guò)相同的標(biāo)記,應(yīng)該理解,將在下面描述的產(chǎn)生中間結(jié)果的處理的一部分,如語(yǔ)法規(guī)范預(yù)處理(例如直到圖2B的步驟250的處理或用于提供被歸檔存儲(chǔ)的預(yù)產(chǎn)生狀態(tài)表的處理),可以以單獨(dú)的形式操作,并且當(dāng)需要時(shí)處理從存儲(chǔ)的數(shù)據(jù)(例如有限自動(dòng)機(jī)或狀態(tài)表)起開(kāi)始操作。本發(fā)明的優(yōu)選應(yīng)用和環(huán)境連同如虛線(xiàn)130所示的硬件加速器一起被配置為集成的形式、或完全或部分單獨(dú)的形式。與本發(fā)明的實(shí)施無(wú)關(guān),回顧FSM狀態(tài)表的性質(zhì)對(duì)于理解本發(fā)明是有用的,尤其是就優(yōu)選的硬件語(yǔ)法分析程序加速器環(huán)境而論。在全部在2002年12月31日提交并且被委派給本發(fā)明代理人的美國(guó)專(zhuān)利申請(qǐng)10/_,_,10/_,_和10/,_,_(事務(wù)所編號(hào)FS-00766、FS-00767和FS-00768)中,分別公開(kāi)了三種不同的硬件語(yǔ)法分析程序加速器實(shí)施,它們?cè)诖苏麄€(gè)被引入作為參考。圖2A顯示了其中公開(kāi)的示范性狀態(tài)表的一部分。應(yīng)該理解,圖2A所示的狀態(tài)表潛在地只是用于對(duì)文檔進(jìn)行語(yǔ)法分析的狀態(tài)表的很小一部分,并且其本質(zhì)上意圖作為示例。雖然至少在所示的形式上、完整的狀態(tài)表通常在物理上不存在,并且圖2A也可用于方便理解公知軟件語(yǔ)法分析程序的操作,但是圖2A中沒(méi)有一個(gè)部分被認(rèn)為是關(guān)于本發(fā)明的先有技術(shù)。應(yīng)該注意,XMLTM文檔在此用作可以利用根據(jù)本發(fā)明的加速器處理的一種邏輯數(shù)據(jù)序列的例子。也可以根據(jù)意圖被共享服務(wù)器計(jì)算機(jī)執(zhí)行的網(wǎng)絡(luò)數(shù)據(jù)分組內(nèi)容、如用戶(hù)終端命令串,來(lái)構(gòu)造其它邏輯數(shù)據(jù)序列。(這種命令串經(jīng)常由惡意用戶(hù)產(chǎn)生,并且被發(fā)送給共享計(jì)算機(jī)作為長(zhǎng)期入侵企圖的一部分。)根據(jù)本發(fā)明的加速器適合于處理多種這樣的邏輯數(shù)據(jù)序列。注意到圖1所示狀態(tài)表的一部分是復(fù)制的也將是有用的。方便且優(yōu)選的是,將符號(hào)的十六進(jìn)制表示用作狀態(tài)表索引,并據(jù)此將狀態(tài)表的垂直列標(biāo)定為“00”至“FF”。對(duì)行進(jìn)行編號(hào),以反映FSM可以呈現(xiàn)的各種狀態(tài)。從而,將多行基地址分成與可以用于代表文檔中要被執(zhí)行語(yǔ)法分析的字符的代碼的數(shù)量相對(duì)應(yīng)的許多列;在該例子中,分成與字符的基本8位十六進(jìn)制字節(jié)相對(duì)應(yīng)的256列。可以以這種形式提供和可能需要的、可打印或不可打印的字符一樣多的字符。注意到所示狀態(tài)表項(xiàng)目的幾個(gè)方面將是有用的,尤其是在理解圖1所示示范性狀態(tài)表的多小部分支持許多字檢測(cè)的方面1.在所示的狀態(tài)表中,在狀態(tài)為0的行中只有兩項(xiàng)包括不同于“保持在狀態(tài)0”的項(xiàng),當(dāng)正在測(cè)試的字符不和任何關(guān)心的串的初始字符匹配時(shí),“保持在狀態(tài)0”項(xiàng)維持初始狀態(tài)。為前進(jìn)到狀態(tài)1作準(zhǔn)備的單項(xiàng)對(duì)應(yīng)于所有關(guān)心的串都以相同字符開(kāi)始的特殊情況。將為前進(jìn)到另一種狀態(tài)作準(zhǔn)備的其它任何字符一般將、但不一定前進(jìn)到不同于狀態(tài)1的狀態(tài),但是對(duì)可以通過(guò)另一個(gè)字符到達(dá)的相同狀態(tài)的進(jìn)一步參考可能對(duì)例如檢測(cè)嵌套串有用處。把{狀態(tài)0,F(xiàn)D}所示的具有“保持在狀態(tài)0”的命令(例如“特殊中斷”)包括進(jìn)來(lái),將用于檢測(cè)和操作特殊單字符。2.在狀態(tài)0以上的狀態(tài)中,“保持在狀態(tài)n”項(xiàng)為通過(guò)例如可能在命令數(shù)值變?cè)杏龅降囊粋€(gè)或多個(gè)字符的潛在長(zhǎng)行程來(lái)維持狀態(tài)作準(zhǔn)備。本發(fā)明提供對(duì)這種類(lèi)型字符串的特殊處理,以便提供增強(qiáng)的加速,如將在下面詳細(xì)討論的。3.在狀態(tài)0以上的狀態(tài)中,“轉(zhuǎn)到狀態(tài)0”項(xiàng)表示檢測(cè)到把串和任何關(guān)心的串區(qū)分開(kāi)的字符,而與先前已檢測(cè)到多少匹配的字符無(wú)關(guān),并且“轉(zhuǎn)到狀態(tài)0”項(xiàng)使語(yǔ)法分析過(guò)程返回到初始/默認(rèn)狀態(tài),以便開(kāi)始搜索另一個(gè)關(guān)心的串。(為此,到目前為止,“轉(zhuǎn)到狀態(tài)0”項(xiàng)一般將是狀態(tài)表中出現(xiàn)最頻繁或最多的項(xiàng)。)返回到狀態(tài)0可能需要語(yǔ)法分析操作返回到文檔中在檢測(cè)到區(qū)別字符時(shí)跟蹤的字符串的開(kāi)始字符之后的字符。4.包括具有“轉(zhuǎn)到狀態(tài)0”的命令的項(xiàng)指示對(duì)所關(guān)心的完整串的檢測(cè)的完成。一般來(lái)說(shuō),命令將要存儲(chǔ)此后允許串被處理為對(duì)象的標(biāo)記(和標(biāo)記的地址和長(zhǎng)度)。然而,具有“轉(zhuǎn)到狀態(tài)n”的命令為起動(dòng)中間點(diǎn)操作、同時(shí)繼續(xù)跟蹤可能潛在地和所關(guān)心的串匹配的串,作準(zhǔn)備。5.為避免搜索在兩個(gè)關(guān)心的串之間發(fā)生分支的任何點(diǎn)處的模糊性(例如具有n-1個(gè)相同初始字符、但具有不同的第n個(gè)字符的兩個(gè)串,或具有不同初始字符的兩個(gè)串),一般需要繼續(xù)進(jìn)行到不同(例如不連貫)狀態(tài),如{狀態(tài)1,01}和{狀態(tài)1,F(xiàn)D}所示。除特殊字符所包括的串和所關(guān)心的串具有共同初始字符的特殊情況以外,完全識(shí)別任意長(zhǎng)度n的串將需要n-1種狀態(tài)。為此,即使對(duì)于較適度的所關(guān)心串的數(shù)量,狀態(tài)表的狀態(tài)和行的數(shù)量通常也必定很大。7.與前一段相反,大多數(shù)狀態(tài)都可以完全由一個(gè)或兩個(gè)唯一的、且默認(rèn)值為“轉(zhuǎn)到狀態(tài)0”的項(xiàng)來(lái)表征。本發(fā)明利用圖1狀態(tài)表的該特征,以便相對(duì)于所關(guān)心的串的一般情況、獲得硬件高度節(jié)約及語(yǔ)法分析過(guò)程的大幅度加速。如常規(guī)地執(zhí)行的語(yǔ)法分析操作以處于給定默認(rèn)/初始狀態(tài)如圖2A中狀態(tài)0的系統(tǒng)開(kāi)始,然后一旦重復(fù)過(guò)程,當(dāng)找到所關(guān)心的字符串的匹配字符時(shí),語(yǔ)法分析操作就前進(jìn)到編號(hào)更高的狀態(tài)。當(dāng)所關(guān)心的串被完全識(shí)別、或者當(dāng)在潛在地是匹配串的串中的中間位置指定了特殊操作時(shí),執(zhí)行諸如存儲(chǔ)標(biāo)記或發(fā)出中斷的操作。然而,每當(dāng)對(duì)文檔的每個(gè)字符重復(fù)操作,都必須從CPU存儲(chǔ)器中取出字符,必須取出狀態(tài)表項(xiàng)目(再次從CPU存儲(chǔ)器中),并且必須在順序操作中更新各種指針(例如指向文檔字符和狀態(tài)表基地址的指針)和寄存器(例如寄存初始匹配字符地址和累積串長(zhǎng)度的寄存器)。以上引入的應(yīng)用中所公開(kāi)的硬件語(yǔ)法分析程序加速器通過(guò)為并行執(zhí)行這些操作中的許多操作作準(zhǔn)備、同時(shí)通過(guò)其中的有限狀態(tài)機(jī)評(píng)定文檔的后續(xù)字符,來(lái)加速語(yǔ)法分析過(guò)程??傊?,語(yǔ)法分析程序的基本功能是,唯一識(shí)別所關(guān)心的輸入字符(例如符號(hào)或二進(jìn)制信號(hào)序列)串,并且一旦實(shí)現(xiàn)這種識(shí)別就發(fā)出唯一標(biāo)記和其它信息。在某些情況下為了某些目的,也必須檢測(cè)和驗(yàn)證所關(guān)心的嵌套串的識(shí)別。因此,重要的是認(rèn)識(shí)到,能夠?qū)е聵?biāo)記發(fā)出的所有字符串都是被執(zhí)行語(yǔ)法分析的文檔的語(yǔ)言的、如通過(guò)那種語(yǔ)言的控制字和特征句法定義的事件。相反,就語(yǔ)言規(guī)范而論,由控制字和/或它們的順序排列表示的語(yǔ)言事件也可以被認(rèn)為是標(biāo)記。從而,語(yǔ)言規(guī)范包含足夠的信息,用于語(yǔ)法分析程序?yàn)榻o定語(yǔ)言或一組關(guān)心的字符串定義能夠?qū)е聵?biāo)記發(fā)出的所有關(guān)心的字符串,從而足以產(chǎn)生要識(shí)別所有關(guān)心的字符串的狀態(tài)表。參考圖2B,圖2B顯示了本發(fā)明一般化形式的操作流程圖。一旦調(diào)用過(guò)程,“下一個(gè)標(biāo)記”就被調(diào)用,如210所示。假定,只有在按照表示語(yǔ)言規(guī)范的數(shù)據(jù)的連續(xù)順序的語(yǔ)言規(guī)范中,才存在某種順序。在存在順序的意義上,實(shí)際順序可以是任意的,并且在任何情況下都不影響將被開(kāi)發(fā)的狀態(tài)轉(zhuǎn)換規(guī)范的可用性,因?yàn)檎Z(yǔ)法分析程序被配置成識(shí)別任何順序的所關(guān)心串。標(biāo)記的順序可以影響所分配的狀態(tài)號(hào),但是那些狀態(tài)號(hào)沒(méi)有實(shí)際意義。即,任何關(guān)心的串都將造成通過(guò)狀態(tài)表狀態(tài)序列前進(jìn),以達(dá)到所關(guān)心的串將被唯一識(shí)別的終結(jié)狀態(tài),但是狀態(tài)和狀態(tài)序列的數(shù)量對(duì)結(jié)果沒(méi)有影響。從而,“下一個(gè)標(biāo)記”的調(diào)用用于通過(guò)使整個(gè)過(guò)程循環(huán)直到所有標(biāo)記都被考慮為止,來(lái)提供一種促使考慮整個(gè)語(yǔ)言規(guī)范的機(jī)制。優(yōu)選地,通過(guò)讀取語(yǔ)法輸入文件215、識(shí)別語(yǔ)法實(shí)體如字符/符號(hào)的控制字和句法要求(例如分支語(yǔ)句、字符定界域等)、并通過(guò)將唯一標(biāo)記分配給每個(gè)被識(shí)別的實(shí)體來(lái)標(biāo)記化它們,以執(zhí)行該操作。在該過(guò)程中也可以考慮和應(yīng)用特殊匹配規(guī)則或準(zhǔn)則(例如指定任意字符的數(shù)量)。在圖2B的220集體指出這些功能。該過(guò)程將導(dǎo)致如230所示的用于某些語(yǔ)法實(shí)體(如代表語(yǔ)言中提供的命令的控制器)的一組轉(zhuǎn)換圖或有限自動(dòng)機(jī)(以下可以通過(guò)該術(shù)語(yǔ)來(lái)參考這種轉(zhuǎn)換圖),而其它語(yǔ)法實(shí)體如遞歸分支語(yǔ)句和定界符符號(hào)將需要附加處理和變換,來(lái)獲得可以在狀態(tài)表中表示的字符串。具體地說(shuō),在240,對(duì)還沒(méi)有被變換為字符串的剩余語(yǔ)法規(guī)則進(jìn)行測(cè)試,以確定它們是遞歸的、還是表示其它性質(zhì)如“排除”操作。如果需要,根據(jù)該測(cè)試,在245簡(jiǎn)化語(yǔ)法規(guī)則,以便將語(yǔ)法規(guī)則表示為字符串、或者將語(yǔ)法規(guī)則擴(kuò)展為擴(kuò)展語(yǔ)法規(guī)則。在這一點(diǎn)上,執(zhí)行246的用于復(fù)制如循環(huán)249所示的步驟的嵌套子過(guò)程,以便為遞歸符號(hào)產(chǎn)生一組新有限自動(dòng)機(jī)。該遞歸符號(hào)變?yōu)檫@組新有限狀態(tài)機(jī)的起始狀態(tài),并且嵌套子過(guò)程內(nèi)遇到的任何附加遞歸符號(hào)將被處理為好像是文字符號(hào)。文字符號(hào)是能夠直接用作狀態(tài)轉(zhuǎn)換輸入的符號(hào)。在返回到230的主處理步驟之前,為遞歸符號(hào)產(chǎn)生的一組新有限自動(dòng)機(jī)被保存在存儲(chǔ)器中,以便稍后進(jìn)行處理,并且遞歸符號(hào)被標(biāo)示為語(yǔ)法規(guī)則中的文字符號(hào),使得當(dāng)處理返回到步驟230時(shí),它中斷遞歸。然后,通過(guò)循環(huán)到210來(lái)重復(fù)過(guò)程,如以上提到的循環(huán)249所示,直到所有語(yǔ)法實(shí)體都被考慮到,并被處理以形成完整的有限自動(dòng)機(jī)序列或狀態(tài)轉(zhuǎn)換圖為止?,F(xiàn)在,在獲得被表示為有限自動(dòng)機(jī)序列的完整語(yǔ)言語(yǔ)法之后,處理繼續(xù)以250的起始狀態(tài)開(kāi)始。狀態(tài)轉(zhuǎn)換圖由狀態(tài)節(jié)點(diǎn)和轉(zhuǎn)換標(biāo)簽邊緣組成。標(biāo)簽邊緣識(shí)別兩種信息輸入(例如轉(zhuǎn)換條件)和下一狀態(tài)。如果相同輸入(例如字符)可以造成轉(zhuǎn)換到不同狀態(tài)的多種轉(zhuǎn)換,則有限自動(dòng)機(jī)被稱(chēng)為非確定性的。230的變換處理既產(chǎn)生非確定性有限自動(dòng)機(jī)(NFA)、又產(chǎn)生確定性有限自動(dòng)機(jī)(DFA)。NFA不適于構(gòu)造硬件加速器FSM的狀態(tài)表。在260執(zhí)行檢查,以挑出NFA。然后,在265通過(guò)使具有確定性質(zhì)的狀態(tài)退縮為閉集,來(lái)將NFA變換為DFA。從而,形成閉集的這些狀態(tài)被組合,然后被代表閉集的新?tīng)顟B(tài)替代。然后,在標(biāo)簽邊緣進(jìn)入和離開(kāi)新?tīng)顟B(tài)的情況下,調(diào)節(jié)狀態(tài)轉(zhuǎn)換。適于該變換的合適技術(shù)對(duì)于編譯器設(shè)計(jì)領(lǐng)域的技術(shù)人員是周知的,在“PrinciplesofCompilerDesign(編譯器設(shè)計(jì)原理)”byAhoandUllman,Addison-WesleyPublishingCo.,1977,pp.91-93中,給出了教科書(shū)例子。通過(guò)268的循環(huán),對(duì)附加狀態(tài)重復(fù)變換。在所有NFA都被變換為DFA之后,則可以在270優(yōu)化DFA,并且在280,在把優(yōu)化的DFA加載到FSM之前將其變換為狀態(tài)表數(shù)據(jù)存儲(chǔ)在大容量存儲(chǔ)器中,或者將優(yōu)化的DFA直接加載到FSM中。既然狀態(tài)以及語(yǔ)言主要部分的狀態(tài)轉(zhuǎn)換完成了,則在循環(huán)292對(duì)在245識(shí)別的每個(gè)遞歸符號(hào)都重復(fù)將有限自動(dòng)機(jī)變換為狀態(tài)表的過(guò)程。在290,識(shí)別出具有還未被變換為狀態(tài)表的有限自動(dòng)機(jī)的遞歸符號(hào)表中的每個(gè)遞歸符號(hào)。在295,專(zhuān)門(mén)為遞歸符號(hào)初始化新?tīng)顟B(tài)表。該新?tīng)顟B(tài)表不一定是物理上分開(kāi)的表??梢詫⒃撔?tīng)顟B(tài)表附加到早先產(chǎn)生的語(yǔ)言主要部分的狀態(tài)表上。在此為簡(jiǎn)化描述,在邏輯上把該新?tīng)顟B(tài)表看作是分開(kāi)的新?tīng)顟B(tài)表。在296,把先前為遞歸符號(hào)產(chǎn)生的有限自動(dòng)機(jī)收集在一起,使得再次從步驟260開(kāi)始執(zhí)行將有限自動(dòng)機(jī)變換為狀態(tài)表的相同過(guò)程。重復(fù)292的循環(huán),直到所有遞歸符號(hào)都被變換為狀態(tài)表為止。上述描述作為本發(fā)明一般形式的概要,現(xiàn)在將參考圖3至圖6來(lái)描述本發(fā)明的優(yōu)選實(shí)施例。優(yōu)選實(shí)施例針對(duì)于產(chǎn)生針對(duì)特殊XMLTM形式的狀態(tài)表。然而,應(yīng)該理解,可以以各種形式、在各種實(shí)施例中,以及為不同目的、如檢測(cè)潛在安全缺口企圖(潛在安全缺口企圖可能使用多種計(jì)算機(jī)語(yǔ)言中任一種語(yǔ)言的某些命令)或僅僅辨別特殊命令、句法等,來(lái)使用本發(fā)明。本領(lǐng)域技術(shù)人員應(yīng)該理解,圖3所示的本發(fā)明優(yōu)選實(shí)施例的操作基本上是圖2B一般化流程圖的擴(kuò)展。另外,圖3的操作被顯示為順序的、而沒(méi)有分支操作,這對(duì)于快速執(zhí)行是優(yōu)選的,同時(shí)足以適應(yīng)XMLTM。為進(jìn)一步加速處理,優(yōu)選地通過(guò)在產(chǎn)生表中提供中間和臨時(shí)存儲(chǔ)器來(lái)避免某些分支,使得只有需要進(jìn)一步處理的語(yǔ)法實(shí)體才保持在處理流中。一旦起動(dòng)過(guò)程,就讀取語(yǔ)法文件,并識(shí)別和標(biāo)記化語(yǔ)法實(shí)體,如310所示。然后,將標(biāo)記化的語(yǔ)法規(guī)則存儲(chǔ)在產(chǎn)生表中,如320所示。然后,將語(yǔ)法規(guī)則操作盡可能地變換為字符串(字符集),如330所示。如以上提到的,優(yōu)選地將語(yǔ)法文件表示為形式記號(hào),如Backus-Naur形式(BNF)或其派生形式,如擴(kuò)展Backus-Naur形式(EBNF)。環(huán)球網(wǎng)聯(lián)盟以這種形式來(lái)使XMLTM文檔化,并且普遍地可以以電子形式得到它。EBNF記號(hào)的概要描述如下語(yǔ)言由符號(hào)組成,該符號(hào)具有一組控制符號(hào)怎樣能夠被正確組合在一起的規(guī)則(語(yǔ)法)。每條EBNF語(yǔ)法規(guī)則都被規(guī)定如下符號(hào)∷=表達(dá)式語(yǔ)言以起始符號(hào)開(kāi)始,并且用右手邊表達(dá)式來(lái)定義符號(hào),如以上使用附加符號(hào)、描述符、屬性和算子的記號(hào)所示。在后續(xù)規(guī)則中定義新的符號(hào),直到為語(yǔ)言定義了所有符號(hào)為止。可以出現(xiàn)在右手邊表達(dá)式中的符號(hào)描述符、屬性和算子被定義如下#xN其中N是十六進(jìn)制整數(shù),表達(dá)式匹配ISO/IEC10646中的,當(dāng)被解釋為無(wú)符號(hào)二進(jìn)制數(shù)時(shí)、其規(guī)范(UCS-4)碼值具有所示值的字符。#xN形式中的前導(dǎo)零數(shù)目是無(wú)意義的;相應(yīng)碼值中的前導(dǎo)零數(shù)目由使用中的字符編碼決定,并且不重要。,[#xN-#xN]和具有所指示的包括范圍中的值的任何字符匹配。,[#xN#xN#xN]和具有所枚舉的字符中的值的任何字符匹配??梢栽谝唤M括號(hào)中混合枚舉和范圍。,[^#xN-#xN]和具有不在所給出的字符中的值的任何字符匹配??梢栽谝唤M括號(hào)中混合枚舉和禁值范圍?!錽tring″和雙引號(hào)內(nèi)的文字串匹配。′string′和單引號(hào)內(nèi)的文字串匹配??梢詫?duì)這些符號(hào)進(jìn)行組合,以匹配如下的更復(fù)雜模式,其中A和B代表簡(jiǎn)單表達(dá)式(表達(dá)式)表達(dá)式被處理為單元,并且可以如該列表所述那樣組合表達(dá)式。A?匹配A或什么都不匹配;A是任選的。AB匹配后面接著B(niǎo)的A。該算子具有比“擇一(alternation)”高的優(yōu)先權(quán);從而AB|CD和(AB)|(CD)是相同的。A|B匹配A或B,但是不匹配A和B兩者;也被稱(chēng)為“擇一(或)”。A-B和匹配A但不匹配B的任何串匹配;(從A中排除B)。A+匹配A的一次或多次出現(xiàn)。連接具有比“擇一”高的優(yōu)先權(quán);從而A+|B+和(A+)|(B+)是相同的。A*匹配A的零次或多次出現(xiàn)。連接具有比“擇一”高的優(yōu)先權(quán);從而A*|B*和(A*)|(B*)是相同的。產(chǎn)生過(guò)程中使用的其它記號(hào)(或規(guī)則組)/*…*/表示注釋。使用以上記號(hào)來(lái)定義XMLTM″Name″的例子如下Namechar∷=Letter|Digit|′.′|′-′|′_′|′′N(xiāo)ame∷=(Letter|′_′|′′)(Namechar)*假定′Letter′表示字母字符、′Digit′表示數(shù)字字符0-9,則XMLTM′N(xiāo)ame′是以字母、下劃線(xiàn)或冒號(hào)開(kāi)始、接著是零個(gè)或多個(gè)′N(xiāo)amechar′的字符序列。′N(xiāo)amechar′是字母字符、數(shù)字字符、句號(hào)、破折號(hào)、下劃線(xiàn)或冒號(hào)。應(yīng)該理解,上述一些記號(hào)指定了“排除”操作(例如A-B)。在332辨別這些記號(hào),并在334將這些記號(hào)變換為能夠被表示為字符集字符串的簡(jiǎn)單規(guī)則。接著,在340識(shí)別遞歸語(yǔ)法規(guī)則。例如,考慮以下兩條XMLTM語(yǔ)法規(guī)則cp∷=(Name|choice|seq)(′?′|′*′|′+′)?choice∷=′(′S?cp(S?′|′S?cp)+S?′)′″cp″和″choice″兩者的擴(kuò)展相互參考。將符號(hào)″cp″或″choice″的定義代入語(yǔ)法規(guī)則表達(dá)式的右手邊將導(dǎo)致無(wú)限長(zhǎng)度的表達(dá)式,這是由于cp和choice相互參考的語(yǔ)法規(guī)則所引起的遞歸造成的。優(yōu)選地,在342,在將語(yǔ)法變換為一組有限自動(dòng)機(jī)之后可以丟棄的臨時(shí)存儲(chǔ)器中,從起始符號(hào)起、從語(yǔ)法產(chǎn)生來(lái)擴(kuò)展這些規(guī)則,將此刻的遞歸符號(hào)處理為特殊文字符號(hào)。文字符號(hào)是一種被它自己用作狀態(tài)轉(zhuǎn)換輸入的符號(hào)。這將導(dǎo)致整個(gè)語(yǔ)言的完整連續(xù)語(yǔ)法規(guī)則。在此被臨時(shí)處理為文字符號(hào)的遞歸符號(hào)將在344被處理。在344,先前識(shí)別的每個(gè)遞歸符號(hào)都用作新擴(kuò)展的起始符號(hào),新擴(kuò)展將以遞歸符號(hào)的完整連續(xù)語(yǔ)法規(guī)則結(jié)束。它使得能夠?qū)iT(mén)為每個(gè)遞歸符號(hào)產(chǎn)生一組新有限自動(dòng)機(jī)。稍后,將在過(guò)程中根據(jù)該步驟所產(chǎn)生的有限自動(dòng)機(jī)來(lái)產(chǎn)生這些遞歸符號(hào)所關(guān)聯(lián)的一組狀態(tài)。為進(jìn)一步說(shuō)明在將把遞歸符號(hào)變換為狀態(tài)之后怎樣處理遞歸符號(hào),在此我們將簡(jiǎn)要描述加載器(圖1中的110)內(nèi)的功能。加載器根據(jù)由硬件加速器個(gè)性編譯器(HAPC)產(chǎn)生的狀態(tài)信息,來(lái)填充硬件加速器FSM內(nèi)的狀態(tài)表。除狀態(tài)識(shí)別和狀態(tài)轉(zhuǎn)換以外,HAPC還識(shí)別去往加載器的所有遞歸符號(hào),如圖6所示。當(dāng)加載器處理涉及遞歸符號(hào)的狀態(tài)轉(zhuǎn)換時(shí),加載器識(shí)別出遞歸符號(hào)。加載器不是使FSM立即轉(zhuǎn)到下一狀態(tài),而是把作為該特殊轉(zhuǎn)換動(dòng)作的命令加載到FSM中,以便將下一狀態(tài)信息推進(jìn)硬件加速器內(nèi)的堆棧中,并分支轉(zhuǎn)到遞歸符號(hào)語(yǔ)法規(guī)則的起始狀態(tài)。對(duì)于遞歸符號(hào)語(yǔ)法中的每個(gè)終結(jié)狀態(tài),加載器都把作為終結(jié)狀態(tài)動(dòng)作的命令加載到FSM中,以便從堆棧中托出狀態(tài)信息,并轉(zhuǎn)到從堆棧中托出的下一狀態(tài)。如果遇到了作為輸入被嵌入遞歸符號(hào)語(yǔ)法規(guī)則的狀態(tài)內(nèi)的遞歸符號(hào),則加載器執(zhí)行和剛才描述的操作相同的操作。作為取得語(yǔ)法規(guī)則中遞歸定義的結(jié)果,硬件加速器內(nèi)的堆棧使得能夠處理這些嵌套的狀態(tài)轉(zhuǎn)換。然后,根據(jù)擴(kuò)展語(yǔ)法規(guī)則產(chǎn)生NFA,并將所產(chǎn)生的NFA變換為DFA,如上述355所示。然后,可以?xún)?yōu)化DFA(360),并將優(yōu)化的DFA變換為狀態(tài)表項(xiàng)目(370),然后存儲(chǔ)該狀態(tài)表項(xiàng)目,如上所述。優(yōu)選地,把以上操作提供為根據(jù)面向?qū)ο缶幊谈拍畹能浖?duì)象。如本
技術(shù)領(lǐng)域:
中容易理解的,對(duì)象實(shí)質(zhì)上是把它們的操作(與程序整體功能和對(duì)象自身之間交互作用的功能有關(guān)的操作)封裝和隱藏起來(lái)的較大程序,同時(shí)如果需要,對(duì)象能夠調(diào)用其它對(duì)象來(lái)執(zhí)行程序。也可以將對(duì)象裝配為具有形成圖4所示上下文的關(guān)系的類(lèi)。在以下對(duì)軟件對(duì)象類(lèi)以及其中的對(duì)象的描述中,對(duì)象以及所提供的對(duì)象功能的描述足以成功實(shí)行本發(fā)明,并且對(duì)象所封裝的對(duì)象進(jìn)一步細(xì)節(jié)對(duì)于本發(fā)明的成功實(shí)行是不重要的。如圖4所示,根據(jù)本發(fā)明的HAPC包括主HAPC類(lèi)和十二個(gè)附加類(lèi)1.InputMgr2.Token3.RuleMgr4.ExpandedRule5.CharSet6.RecursiveSymbolMgr7.RSEntry8.NFAMgr9.StateMgr10.StateEntry11.TransitionEntry12.DFAMgr以下將按順序?qū)λ鼈冞M(jìn)行討論。HAPC類(lèi)包含用于命令從讀取輸入、執(zhí)行編譯處理、直到寫(xiě)輸出的執(zhí)行的主程序和方法。InputMgr類(lèi)對(duì)象負(fù)責(zé)對(duì)來(lái)自語(yǔ)法規(guī)則規(guī)范文件的輸入進(jìn)行標(biāo)記化。Token類(lèi)對(duì)象定義所支持的標(biāo)記種類(lèi),并對(duì)訪(fǎng)問(wèn)、設(shè)置和更新標(biāo)記提供支持。RuleMgr類(lèi)對(duì)象把標(biāo)記化的語(yǔ)法產(chǎn)生規(guī)則組織在散列表中,以允許軟件能夠快速訪(fǎng)問(wèn)語(yǔ)法規(guī)則。CharSet類(lèi)對(duì)象對(duì)語(yǔ)法規(guī)則中的字符集實(shí)體提供專(zhuān)門(mén)支持。ExpandedRule類(lèi)對(duì)象提供一種用于從特定標(biāo)記開(kāi)始將語(yǔ)法規(guī)則改進(jìn)為連續(xù)語(yǔ)言規(guī)則的工具。RecursiveSymbolMgr類(lèi)對(duì)象提供一種用于識(shí)別在語(yǔ)法規(guī)則定義中遞歸使用的符號(hào)的倉(cāng)庫(kù)。RSEntry類(lèi)對(duì)象定義遞歸符號(hào)倉(cāng)庫(kù)項(xiàng)目格式。NFAMgr類(lèi)對(duì)象對(duì)從語(yǔ)法規(guī)則創(chuàng)建非確定性有限自動(dòng)機(jī)提供支持。StateMgr類(lèi)對(duì)象管理一種包含用于創(chuàng)建狀態(tài)表的狀態(tài)轉(zhuǎn)換信息的倉(cāng)庫(kù)。StateEntry類(lèi)對(duì)象定義用于狀態(tài)倉(cāng)庫(kù)中項(xiàng)目的格式。TransitionEntry類(lèi)對(duì)象提供一種用于存儲(chǔ)狀態(tài)轉(zhuǎn)換信息的工具。DFAMgr類(lèi)對(duì)象對(duì)把非確定性有限自動(dòng)機(jī)轉(zhuǎn)換為適于產(chǎn)生狀態(tài)表的確定性有限自動(dòng)機(jī)提供支持。HAPCHAPC類(lèi)包含用于開(kāi)始整個(gè)編譯過(guò)程的主程序。除主方法以外,HAPC類(lèi)還包含以下方法genStateswiteStateTransitionstimestampToStringgenStates方法是編譯過(guò)程的主驅(qū)動(dòng)程序。genStates方法創(chuàng)建其它類(lèi)對(duì)象、并與所創(chuàng)建的其它類(lèi)對(duì)象對(duì)接,以便讀取輸入語(yǔ)法規(guī)范、將語(yǔ)法規(guī)范信息處理為有限狀態(tài)、并將狀態(tài)轉(zhuǎn)換信息寫(xiě)出到文件。writeStateTransition方法為HAPC所產(chǎn)生的狀態(tài)轉(zhuǎn)換規(guī)范創(chuàng)建輸出流,并將信息寫(xiě)出到輸出文件。timestampToString方法是一種支持writeStateTransition方法、以便將timestamp(時(shí)間戳)信息格式化為可打印串的實(shí)用方法。InputMgr硬件加速器個(gè)性編譯器輸入管理程序InputMgr負(fù)責(zé)讀取包含語(yǔ)言語(yǔ)法規(guī)則的輸入文件、并將輸入規(guī)則數(shù)據(jù)編碼為標(biāo)記。輸入文件中的信息被分解為標(biāo)記,使得能夠通過(guò)它們的種類(lèi)來(lái)容易地識(shí)別它們。InputMgr類(lèi)支持以下構(gòu)造程序和方法InputMgrnext_tokenstartNewSectionnext_lineparseCharLiteralInputMgr構(gòu)造程序設(shè)置Java緩沖區(qū)頭,以便讀入輸入語(yǔ)法規(guī)則文件。輸入語(yǔ)法規(guī)則文件由以下三個(gè)部分組成用戶(hù)指令,產(chǎn)生規(guī)則,以及產(chǎn)生規(guī)則重載。這三個(gè)部分通過(guò)始于且只包含兩個(gè)字符%%的行,而相互分開(kāi)。用戶(hù)指令部分首先出現(xiàn)在文件的開(kāi)頭。所有用戶(hù)指令關(guān)鍵字都以″%″為前綴。當(dāng)前,唯一支持的用戶(hù)指令是具有一個(gè)變?cè)模tartSymbol。該變?cè)付ㄔ诋a(chǎn)生規(guī)則部分中定義的語(yǔ)言的起始符號(hào)。符號(hào)集內(nèi)圍起的注釋/*和*/可以出現(xiàn)在輸入文件中的任何地方。產(chǎn)生規(guī)則部分包含要處理的語(yǔ)言的語(yǔ)法規(guī)則。當(dāng)前,假定用EBNF格式來(lái)表示語(yǔ)法規(guī)則。產(chǎn)生規(guī)則的所有左手邊符號(hào)都必須始于第1列。產(chǎn)生規(guī)則可以跨越許多行。所有續(xù)行都必須始于第1列的至少空白字符。產(chǎn)生規(guī)則重載部分是最后一部分,并且是任選的部分。產(chǎn)生規(guī)則重載部分允許用戶(hù)重新規(guī)定早先出現(xiàn)在產(chǎn)生規(guī)則部分中的某些產(chǎn)生規(guī)則。當(dāng)所有語(yǔ)法規(guī)則都由語(yǔ)言創(chuàng)建者定義時(shí),這允許用戶(hù)規(guī)定所有語(yǔ)法規(guī)則、而不對(duì)產(chǎn)生規(guī)則部分進(jìn)行任何改變。如果某些規(guī)則具有一些不能被該軟件自動(dòng)處理的記號(hào),用戶(hù)可以?xún)H僅利用產(chǎn)生規(guī)則重載部分中該軟件所支持的記號(hào),來(lái)重新規(guī)定那些規(guī)則。在調(diào)用InputMgr構(gòu)造程序之后,HAPC軟件可以開(kāi)始通過(guò)重復(fù)調(diào)用next_token方法,每次一個(gè)標(biāo)記從輸入文件中提取整個(gè)輸入語(yǔ)法產(chǎn)生規(guī)則。最初,通過(guò)識(shí)別從輸入文件創(chuàng)建的輸入字符流中的定界符字符,來(lái)形成每個(gè)標(biāo)記。然后,將標(biāo)記分類(lèi)為不同的標(biāo)記種類(lèi)。在Token部分中進(jìn)一步詳細(xì)描述這些標(biāo)記種類(lèi)。InputMgr透明地處理格式化信息,并跳過(guò)輸入文件中的所有注釋。對(duì)于輸入文件中被指定為數(shù)值的字符文字,在對(duì)它們進(jìn)行標(biāo)記化之前,通過(guò)parseCharLiteral方法在內(nèi)部將它們轉(zhuǎn)換為字符值。startNewSection是一種允許調(diào)用程序使InputMgr從“規(guī)則部分結(jié)束”狀態(tài)復(fù)位、由此允許軟件讀入附加產(chǎn)生規(guī)則來(lái)重載某些先前語(yǔ)法規(guī)則規(guī)范的簡(jiǎn)單方法。構(gòu)造程序、startNewSection和next_token方法是InputMgr類(lèi)對(duì)象的主要外部接口。InputMgr類(lèi)中實(shí)施的其它私有方法有next_line和parserCharLiteral。私有方法next_line從輸入文件得到一行字符,并將輸入行的剪切型式返回給調(diào)用程序。next_line方法保持輸入文件的行計(jì)數(shù),并剪掉輸入文件開(kāi)始和結(jié)尾處的空格。另一私有方法是parseCharLiteral。parseCharLiteral方法把被表示為十六進(jìn)制數(shù)的字符文字轉(zhuǎn)換為內(nèi)部ASCII字符。這允許以和可打印字符相同的方式,來(lái)在軟件內(nèi)處理不可打印的字符。TokenToken類(lèi)提供一種創(chuàng)建和維護(hù)標(biāo)記的工具。通過(guò)將輸入字符流分解為標(biāo)記,軟件可以容易地對(duì)輸入文件中的每個(gè)邏輯字符序列進(jìn)行分類(lèi),并據(jù)此處理信息。有7種主要標(biāo)記種類(lèi)控制;符號(hào);算子;屬性;組;雜項(xiàng)(Misc);及未知??刂品N類(lèi)內(nèi)的最重要標(biāo)記是文件結(jié)束(EOF),EOF向軟件指示到達(dá)了輸入文件結(jié)尾??刂品N類(lèi)中也定義了其它少數(shù)標(biāo)記,然而,它們僅供軟件內(nèi)短暫使用。因?yàn)檫@些少數(shù)標(biāo)記對(duì)根據(jù)本發(fā)明基本原理的本發(fā)明實(shí)行不重要,所以在此將不詳細(xì)描述它們。屬于符號(hào)種類(lèi)的標(biāo)記包括StrProd(開(kāi)始產(chǎn)生)、Symbol(正規(guī)語(yǔ)法符號(hào))、RecursiveSymbol、Literal、Set和CharSet。StrProd標(biāo)記被創(chuàng)建用于存儲(chǔ)新語(yǔ)法規(guī)則的名稱(chēng)。Symbol標(biāo)記表示一般語(yǔ)法規(guī)則符號(hào)。RecursiveSymbol是一種在軟件確定在語(yǔ)法規(guī)則中遞歸使用符號(hào)之后、從一般Symbol標(biāo)記重新分類(lèi)的標(biāo)記。當(dāng)對(duì)單字符、字符的數(shù)字表示以及字符串進(jìn)行標(biāo)記化時(shí),將它們標(biāo)示為文字。在對(duì)字符的數(shù)字表示進(jìn)行標(biāo)記化之前,將字符的數(shù)字表示轉(zhuǎn)換為正規(guī)ASCII字符。通過(guò)這樣做,用同樣方式來(lái)處理所有字符。方括號(hào)圍起的輸入串被分配給Set標(biāo)記。Set標(biāo)記可以具有某一離散字符集合、或某一字符范圍。當(dāng)集合內(nèi)的值被處理為標(biāo)示屬于該集合的每個(gè)單字符的位集合時(shí),Set標(biāo)記被轉(zhuǎn)換為CharSet。利用語(yǔ)法規(guī)則中的“擇一”算子關(guān)聯(lián)在一起的字符也被歸合到CharSet中。算子標(biāo)記是自明(self-explanatory)的。這些算子用于語(yǔ)法規(guī)則中,用來(lái)組合和混合語(yǔ)言基本實(shí)體,以形成更復(fù)雜的實(shí)體。屬于算子種類(lèi)的標(biāo)記有OpExpInto;OpOr;及OpExclude。在EBNF記號(hào)中OpExpInto是″∷=″符號(hào)。OpExpInto向軟件指示,標(biāo)記序列將緊接著該標(biāo)記之后,并且它們將形成剛好在該標(biāo)記之前出現(xiàn)的左手邊符號(hào)的擴(kuò)展規(guī)則。OpOr是“或”算子,在EBNF記號(hào)中以“|”符號(hào)表示。OpExclude是“排除”算子,在EBNF記號(hào)中以“-”符號(hào)表示。早先在形式語(yǔ)法部分中描述了這兩個(gè)算子。屬性標(biāo)記用于描述語(yǔ)言特定規(guī)則中的符號(hào)的允許出現(xiàn)頻率。屬性種類(lèi)中的標(biāo)記包括AttZeroOrOne;AttZeroOrMany;及AttOneOrMany。AttZeroOrOne在EBNF記號(hào)中以“?”字符來(lái)表示,并用于指示剛剛在該標(biāo)記之前出現(xiàn)的符號(hào)是任選的符號(hào)。在語(yǔ)言?xún)?nèi)的該特殊上下文中,那個(gè)任選符號(hào)可以出現(xiàn)0次,或剛好出現(xiàn)一次。AttZeroOrMany在EBNF中以“*”字符來(lái)表示,并用于指示剛剛在該標(biāo)記之前出現(xiàn)的符號(hào)可以在當(dāng)前上下文中出現(xiàn)0次或多次。同時(shí),AttOneOrMany類(lèi)似地允許先前標(biāo)記化的符號(hào)出現(xiàn)一次或多次,并且在EBNF中以“+”字符來(lái)表示。組種類(lèi)(Groupcategory)具有兩種定義的標(biāo)記LParen和RParen。LParen表示組開(kāi)始,而RParen表示組結(jié)束。通過(guò)左括號(hào)和右括號(hào)所圍起的表達(dá)式,來(lái)定義組。組內(nèi)的整個(gè)表達(dá)式被處理為單元。組可以被嵌入另一個(gè)組內(nèi)。雜項(xiàng)種類(lèi)(Misccategory)包含元標(biāo)記。這些標(biāo)記包括BlockStart;BlockEnd;及RecExp。這些標(biāo)記被插入內(nèi)部產(chǎn)生表所存儲(chǔ)的語(yǔ)法規(guī)則中,主要供調(diào)試之用。作為狀態(tài)轉(zhuǎn)換產(chǎn)生過(guò)程的一部分,從“語(yǔ)言起始符號(hào)”開(kāi)始成行擴(kuò)展語(yǔ)法規(guī)則,直到所有符號(hào)都變?yōu)榻K結(jié)符號(hào)或遞歸符號(hào)為止。當(dāng)然不成行擴(kuò)展遞歸符號(hào),這是因?yàn)檫f歸擴(kuò)展將導(dǎo)致無(wú)限循環(huán),如上所述。為幫助調(diào)試,將BlockStart和BlockEnd標(biāo)記插入在成行擴(kuò)展期間得到的規(guī)則中,以識(shí)別擴(kuò)展的規(guī)則內(nèi)的規(guī)則段的開(kāi)始和結(jié)束。標(biāo)記包含來(lái)自原始輸入產(chǎn)生規(guī)則的左手邊符號(hào)名,以幫助識(shí)別。RecExp指示遞歸表達(dá)式。未知標(biāo)記種類(lèi)是一種在解析未知標(biāo)記時(shí)、或者在把未知標(biāo)記作為錯(cuò)誤報(bào)告給用戶(hù)之前,被軟件用來(lái)臨時(shí)保存該未知標(biāo)記的位置容器種類(lèi)。Token類(lèi)提供構(gòu)造程序和以下方法TokenequalssetTokengetCategoryisCategoryControlisCategorySymbolisCategoryOperatorisCategoryAttributeisCategoryGroupisCategoryMiscprintToken構(gòu)造程序和setToken方法允許調(diào)用程序從頭開(kāi)始構(gòu)造標(biāo)記。調(diào)用程序可以利用getCategory、equals和各種isCategoryXXXX方法,來(lái)執(zhí)行標(biāo)記查詢(xún)。print方法將向屏幕打印與標(biāo)記有關(guān)的所有信息。RuleMgrRuleMgr類(lèi)提供一種在被稱(chēng)為ruleTable的散列表(hashtable)中創(chuàng)建并維護(hù)語(yǔ)法產(chǎn)生規(guī)則的工具。語(yǔ)法產(chǎn)生規(guī)則的右手邊表達(dá)式被存儲(chǔ)為標(biāo)記矢量。通過(guò)把產(chǎn)生規(guī)則的左手邊符號(hào)用作散列關(guān)鍵字,將矢量保存到散列表中。RuleMgr構(gòu)造程序提供一種初始化RuleMgr類(lèi)的普通機(jī)制。RuleMgr類(lèi)提供其它方法來(lái)幫助構(gòu)造ruleTable,以便查詢(xún)r(jià)uleTable、執(zhí)行轉(zhuǎn)換、以及支持調(diào)試。這些方法是parseEBNFRulescheckRulecomponentLengthextractCharSetreplaceGroupsWithCharsetsconvertCharSetEntitiesfindExclusionfindAlternationgroupRightAltParamgoupLeftAltParamgroupAltParamsprintRulereplaceRuleparseEBNFRules是RuleMgr類(lèi)提供的一種重要方法。parseEBNFRules允許調(diào)用程序從輸入語(yǔ)法文件中提取語(yǔ)法規(guī)則規(guī)范。parseEBNFRules方法利用傳入的InputMgr來(lái)讀取語(yǔ)法文件。然后,parseEBNFRules方法將每條產(chǎn)生規(guī)則重新構(gòu)造為標(biāo)記矢量。規(guī)則被保存到ruleTable中,并且通過(guò)規(guī)則的左手邊符號(hào)來(lái)檢索每條規(guī)則。checkRule方法允許調(diào)用程序確定ruleTable中是否已定義規(guī)則。這消除了調(diào)用程序直接訪(fǎng)問(wèn)實(shí)施ruleTable的散列表的需要。給定語(yǔ)法規(guī)則的符號(hào)名,componentLength方法返回為定義語(yǔ)法規(guī)則所需的標(biāo)記數(shù)。該方法的典型用途是,確定在語(yǔ)法規(guī)則表達(dá)式中規(guī)則是否只有單一組成部分(例如集合)。extractCharSet方法檢查如作為輸入的一對(duì)索引所指定的語(yǔ)法產(chǎn)生規(guī)則的一段標(biāo)記矢量,并確定是否可以將表達(dá)式子集分解為CharSet。如果可以將表達(dá)式子集變換為CharSet,則extractCharSet方法將把CharSet返回給調(diào)用程序。該方法支持convertCharSetEntities方法。replaceGroupsWithCharsets方法經(jīng)歷傳入的包含標(biāo)記序列的矢量,并用字符集(CharSet)代替所有合適的表達(dá)式子集。該方法支持convertCharSetEntities方法。convertCharSetEntities方法經(jīng)歷整個(gè)ruleTable,并將所有集合和符合條件的表達(dá)式子集變換為CharSet。findExclusion方法經(jīng)歷整個(gè)ruleTable,并找到包含“排除”算子的所有語(yǔ)法產(chǎn)生規(guī)則。在完成后,該方法以矢量形式返回那些語(yǔ)法規(guī)則。findAlternation方法經(jīng)歷整個(gè)ruleTable,并找到包含“或”算子的所有語(yǔ)法產(chǎn)生規(guī)則。在完成后,該方法以矢量形式返回那些語(yǔ)法規(guī)則。如果還沒(méi)有用括號(hào)來(lái)分組子表達(dá)式,groupRightAltParam方法在語(yǔ)法規(guī)則中“或”算子的右手邊子表達(dá)式周?chē)砑右粚?duì)括號(hào)。如果還沒(méi)有用括號(hào)來(lái)分組子表達(dá)式,groupLeftAltParam方法在語(yǔ)法規(guī)則中“或”算子的左手邊子表達(dá)式周?chē)砑右粚?duì)括號(hào)。如果還沒(méi)有用括號(hào)來(lái)分組子表達(dá)式,groupAltParam方法在語(yǔ)法規(guī)則中“或”算子兩邊的兩個(gè)子表達(dá)式周?chē)砑右粚?duì)括號(hào)。printRule方法通過(guò)向屏幕打印用輸入左手邊符號(hào)命名為標(biāo)記序列的語(yǔ)法規(guī)則,來(lái)提供調(diào)試支持。replaceRule方法代替如用輸入符號(hào)命名的語(yǔ)法規(guī)則的標(biāo)記矢量。ExpandedRuleExpandedRule類(lèi)的主要用途是,提供一種從起始符號(hào)開(kāi)始擴(kuò)展語(yǔ)法規(guī)則,并繼續(xù)成行擴(kuò)展所有產(chǎn)生規(guī)則、直到所有規(guī)則符號(hào)都被改進(jìn)為字符集、字符串文字或遞歸符號(hào)為止的工具。字符集和字符串文字是能夠被進(jìn)一步改進(jìn)的終結(jié)符號(hào)。由于遞歸符號(hào)遞歸進(jìn)入相同狀態(tài)的性質(zhì),遞歸符號(hào)需要堆棧執(zhí)行其狀態(tài)轉(zhuǎn)換。單獨(dú)的特殊過(guò)程將被執(zhí)行,以處理遞歸符號(hào)。盡管為規(guī)則擴(kuò)展起見(jiàn),它們也被處理為好像是終結(jié)符號(hào)。提供兩個(gè)構(gòu)造程序,來(lái)擴(kuò)展傳入的RuleMgr對(duì)象中包含的語(yǔ)法產(chǎn)生規(guī)則。為提供對(duì)多個(gè)規(guī)則表的獨(dú)立處理,RuleMgr成為構(gòu)造程序的輸入變?cè)?。?gòu)造程序所需的另一個(gè)輸入變?cè)恰罢Z(yǔ)言起始符號(hào)”。這向構(gòu)造程序提供擴(kuò)展規(guī)則的起始點(diǎn)。兩個(gè)構(gòu)造程序之一還需要布爾標(biāo)志變?cè)?,以指示是否需要壓縮所得到的擴(kuò)展產(chǎn)生規(guī)則。通過(guò)避免產(chǎn)生主要為調(diào)試目的而產(chǎn)生的標(biāo)記、尤其是雜項(xiàng)標(biāo)記,并積極將規(guī)則段變換為字符集,來(lái)執(zhí)行壓縮。這些構(gòu)造程序是調(diào)用程序需要用來(lái)擴(kuò)展語(yǔ)法規(guī)則的主要接口。構(gòu)造程序?qū)⒄{(diào)用內(nèi)部私有方法來(lái)成行擴(kuò)展產(chǎn)生規(guī)則,導(dǎo)致了覆蓋整個(gè)語(yǔ)言的單一語(yǔ)法規(guī)則。在擴(kuò)展規(guī)則的過(guò)程中,這些方法也將識(shí)別遞歸符號(hào)。在擴(kuò)展工作中,這些遞歸符號(hào)被處理為好像是終結(jié)符號(hào)。構(gòu)造程序也將遞歸符號(hào)保存到RecursiveSymbolMgr所維護(hù)的表中,以便以后進(jìn)行處理。在最高級(jí)產(chǎn)生規(guī)則已被擴(kuò)展之后,調(diào)用程序可以調(diào)用“expandAllRS”方法,來(lái)擴(kuò)展被構(gòu)造程序識(shí)別和保存的所有遞歸符號(hào)。expandAllRS和performSimpleExclude方法是ExpandedRule類(lèi)中的所有其它外部接口。expandAllRS方法從RecursiveSymbolMgr類(lèi)得到所有遞歸符號(hào)的列表,并且每次一個(gè)地?cái)U(kuò)展每個(gè)遞歸符號(hào)。類(lèi)似于最高級(jí)擴(kuò)展,在擴(kuò)展過(guò)程期間遇到的任何遞歸符號(hào)都將被處理為終結(jié)符號(hào)。這些遞歸符號(hào)將造成在狀態(tài)轉(zhuǎn)換表生成期間產(chǎn)生特殊動(dòng)作碼,使得該特殊動(dòng)作碼可以請(qǐng)求堆棧支持遞歸。performSimpleExclude方法經(jīng)歷擴(kuò)展的語(yǔ)法規(guī)則,以定位“排除(-)”算子。對(duì)于performSimpleExclude方法所遇到的每個(gè)“排除”算子,如果確定“排除”操作的操作數(shù)是具有字符文字的字符集、或兩個(gè)字符集,則performSimpleExclude方法將立即執(zhí)行“排除”操作,并用所得到的字符集來(lái)代替語(yǔ)法規(guī)則中的操作表達(dá)式。ExpandedRule中的其余方法是私有方法。這些方法是initisOnTheStackexpandexpandRSinit方法幫助構(gòu)造程序初始化類(lèi)變量,以及起動(dòng)語(yǔ)法規(guī)則成行擴(kuò)展處理。isOnTheStack方法向構(gòu)造程序提供內(nèi)部支持,以確定語(yǔ)法符號(hào)是否為遞歸符號(hào)。軟件通過(guò)將每個(gè)被擴(kuò)展的符號(hào)推進(jìn)堆棧中,來(lái)記住沿著擴(kuò)展鏈的語(yǔ)法符號(hào)。一旦符號(hào)被完全擴(kuò)展,該符號(hào)就從堆棧被托出。在擴(kuò)展符號(hào)之前,代碼檢查符號(hào)是否已經(jīng)在堆棧上。如果情況是這樣的,則將符號(hào)識(shí)別為遞歸符號(hào)。expand方法是一種通過(guò)獲得它所遇到的每個(gè)非終結(jié)符號(hào)的右手邊表達(dá)式、并用表達(dá)式來(lái)代替符號(hào),來(lái)執(zhí)行語(yǔ)法規(guī)則成行擴(kuò)展的遞歸方法。expand方法從起始符號(hào)開(kāi)始,并且繼續(xù)代替被擴(kuò)展的規(guī)則中的每個(gè)符號(hào),直到所有符號(hào)都變?yōu)榻K結(jié)符號(hào)或遞歸符號(hào)為止。堆棧用于在isOnTheStack方法中識(shí)別所有遞歸符號(hào),如上所述。expandRS方法和上述expand方法很類(lèi)似。expandRS方法支持expandAllRS方法專(zhuān)門(mén)為遞歸符號(hào)擴(kuò)展語(yǔ)法規(guī)則。類(lèi)似于expand方法,通過(guò)復(fù)制代表用ruleMgr中的非終結(jié)符號(hào)命名的產(chǎn)生規(guī)則的標(biāo)記矢量、并用標(biāo)記矢量代替被擴(kuò)展的規(guī)則中的符號(hào),來(lái)執(zhí)行擴(kuò)展。連續(xù)重復(fù)該過(guò)程,直到被擴(kuò)展的規(guī)則的所有符號(hào)都成為終結(jié)符號(hào)或遞歸符號(hào)為止。如果在擴(kuò)展期間遇到遞歸符號(hào),包括正被擴(kuò)展的遞歸規(guī)則符號(hào)自己,則該遞歸符號(hào)被處理為好像是終結(jié)符號(hào)。CharSetCharSet類(lèi)支持一種用于存儲(chǔ)語(yǔ)法產(chǎn)生規(guī)則中的表達(dá)式中所使用的有效字符集、或從語(yǔ)法規(guī)則中的子表達(dá)式得到的有效字符集的設(shè)置工具。最初在產(chǎn)生規(guī)則中指定的EBNF形式的字符集被封入一對(duì)方括號(hào)內(nèi)??梢砸远喾N方式表示方括號(hào)內(nèi)的內(nèi)容包含所有有效離散字符的字符序列某一字符范圍被表示為十六進(jìn)制值的單字符利用十六進(jìn)制值表示的字符范圍范圍記號(hào)之外以上的組合CharSet類(lèi)所提供的方法將處理所有這些指定有效字符集的不同方式,并將它們轉(zhuǎn)換為相對(duì)于調(diào)用程序透明的CharSet對(duì)象。從CharSet類(lèi)可以得到允許調(diào)用程序維護(hù)CharSet對(duì)象的附加方法??梢缘玫絻蓚€(gè)CharSet構(gòu)造程序。無(wú)參數(shù)的構(gòu)造程序允許調(diào)用程序設(shè)置一種要在稍后添加內(nèi)容的CharSet對(duì)象。另一構(gòu)造程序允許調(diào)用程序設(shè)置CharSet,并通過(guò)指定用如上所述的信息格式化的串來(lái)初始化CharSet對(duì)象內(nèi)容。CharSet類(lèi)中定義的方法有addremoveisInisEqualprintcharCountiterator有三種重載“add”方法。每種add方法都允許調(diào)用程序?qū)⒏嘧址砑拥紺harSet對(duì)象中。第一種變型允許調(diào)用程序利用如上所述的串格式指定多個(gè)字符。第二種add方法允許調(diào)用程序向CharSet對(duì)象添加字符。而第三種變型允許調(diào)用程序?qū)⒘硪籆harSet對(duì)象的內(nèi)容復(fù)制到當(dāng)前對(duì)象中。有兩種重載“remove”方法。第一種型式允許調(diào)用程序從當(dāng)前CharSet對(duì)象中刪除字符。第二種型式接收CharSet對(duì)象作為輸入?yún)?shù)。它從當(dāng)前CharSet對(duì)象中刪除在輸入CharSet中發(fā)現(xiàn)的所有字符。isIn方法允許調(diào)用程序查明當(dāng)前在CharSet對(duì)象中是否有特殊字符。isEqual方法把另一個(gè)CharSet對(duì)象和當(dāng)前對(duì)象進(jìn)行對(duì)比,以確定它們是否具有相同內(nèi)容。print方法是為調(diào)試目的而設(shè)的。print方法向屏幕打印CharSet對(duì)象的當(dāng)前內(nèi)容。charCount方法返回CharSet中當(dāng)前的字符數(shù)。iterator方法將迭代程序?qū)ο蠓祷亟o調(diào)用程序,允許調(diào)用程序每次一個(gè)地訪(fǎng)問(wèn)CharSet內(nèi)的每個(gè)字符。為支持iterator方法,CharSet類(lèi)也包含內(nèi)部類(lèi)CharSetIterator。CharSetIterator是Iterator接口的實(shí)施。RecursiveSymbolMgrRecursiveSymbolMgr維護(hù)散列表,允許調(diào)用程序設(shè)置表,以包含本質(zhì)上遞歸的產(chǎn)生規(guī)則。遞歸符號(hào)表被InputMgr、ExpandedRule和NFAMgr類(lèi)使用。RecursiveSymbolMgr類(lèi)利用構(gòu)造程序來(lái)生成Java散列表。因?yàn)槭抢肑ava散列表來(lái)實(shí)施表的,所以利用散列表方法來(lái)執(zhí)行對(duì)遞歸符號(hào)表的訪(fǎng)問(wèn)和維護(hù)。RecursiveSymbolMgr類(lèi)不定義任何附加方法。RSEntryRSEntry類(lèi)定義被實(shí)施為RecursiveSymbolMgr類(lèi)中的散列表的遞歸符號(hào)表的項(xiàng)目結(jié)構(gòu)。RSEntry類(lèi)的用途是定義數(shù)據(jù)結(jié)構(gòu)。因而,只提供構(gòu)造程序來(lái)初始化類(lèi)變量。數(shù)據(jù)結(jié)構(gòu)中的所有字段都可以利用它們的本來(lái)的(native)方法來(lái)直接訪(fǎng)問(wèn)。NFAMgrNFAMgr類(lèi)對(duì)把擴(kuò)展的語(yǔ)法產(chǎn)生規(guī)則變換為NFA提供支持。NFAMgr類(lèi)封裝用于存儲(chǔ)從擴(kuò)展的輸入語(yǔ)法規(guī)則產(chǎn)生的狀態(tài)轉(zhuǎn)換信息的StateMgr類(lèi)。用NFAMgr構(gòu)造程序來(lái)例示StateMgr。除構(gòu)造程序以外,NFAMgr類(lèi)也定義以下方法genStatesgenNFAfindLoopbackStatecheckAttributeNexteliminateDoubleEpsilonsoptimizeEpsilonTransitionsgenStates方法允許調(diào)用程序起動(dòng)將擴(kuò)展的語(yǔ)法規(guī)則變換為NFA的處理。輸入擴(kuò)展語(yǔ)法規(guī)則作為標(biāo)記矢量被傳入。然后,genStates方法調(diào)用遞歸genNFA方法,來(lái)將擴(kuò)展的語(yǔ)法規(guī)則分解為可管理的段、并將這些段轉(zhuǎn)換為狀態(tài)轉(zhuǎn)換。genNFA方法每次以遞歸形式處理一段輸入擴(kuò)展語(yǔ)法規(guī)則,直到整個(gè)語(yǔ)法規(guī)則被變換為完整的NFA為止。通過(guò)分組和識(shí)別語(yǔ)法規(guī)則定義中使用的普通子表達(dá)式,來(lái)執(zhí)行處理,如圖5A至5I所示。圖5A至5I通過(guò)各個(gè)圖中包含的標(biāo)示顯示了幾種通常出現(xiàn)的被描述為以上定義的NFA的語(yǔ)言模式。例如,圖5A顯示了代表“a”出現(xiàn)零次或多次的模式“a*”;圖5B顯示了代表“a”出現(xiàn)零次或一次的模式“a?”;等等。相應(yīng)模式的這種記號(hào)和邏輯處理是編譯器中用于具體表示這些模式的眾所周知技術(shù)。然而,因?yàn)橐粋€(gè)輸入,如ε(epsilon厄普西隆、空輸入),可以造成多種狀態(tài)轉(zhuǎn)換,如圖5D中的步驟2),所以最后必須將這種表示改變?yōu)镈FA,如以上所提到的。優(yōu)選地,在這一點(diǎn)上不以最優(yōu)形式執(zhí)行變換,以便產(chǎn)生普通狀態(tài)轉(zhuǎn)換模式,使分組和組合語(yǔ)法規(guī)則子表達(dá)式的結(jié)果變得容易。一旦生成完整的NFA狀態(tài)轉(zhuǎn)換序列,就將消除冗余狀態(tài),并將組合普通狀態(tài)。findLoopbackState方法支持checkAttributeNext方法中的屬性(即*+?)變換處理,以確定當(dāng)前語(yǔ)法子表達(dá)式組的起始狀態(tài),使得可以正確地為每一屬性添加一個(gè)或多個(gè)轉(zhuǎn)換弧(transitionarcs)。checkAttributeNext方法查明是否為剛剛被變換為NFA序列的語(yǔ)法規(guī)則子表達(dá)式定義于屬性。如果發(fā)現(xiàn)屬性,則checkAttributeNext方法將在NFA中添加適當(dāng)?shù)霓D(zhuǎn)換,以滿(mǎn)足屬性規(guī)范。eliminateDoubleEpsilons方法優(yōu)化NFA轉(zhuǎn)換序列,以消除冗余狀態(tài)轉(zhuǎn)換。optimizeEpsilonTransitions方法消除完整NFA狀態(tài)轉(zhuǎn)換序列內(nèi)的外來(lái)轉(zhuǎn)換。StateMgrStateMgr類(lèi)支持狀態(tài)轉(zhuǎn)換表的創(chuàng)建和維護(hù)。StateMgr類(lèi)對(duì)NFAMgr類(lèi)和DFAMgr類(lèi)兩者提供支持。類(lèi)構(gòu)造程序初始化類(lèi)變量,并為狀態(tài)轉(zhuǎn)換表分配內(nèi)存。另外,構(gòu)造程序創(chuàng)建將NFA狀態(tài)(舊狀態(tài))映射到DFA狀態(tài)(新?tīng)顟B(tài))的散列表,來(lái)支持DFA變換。StateMgr類(lèi)中定義的其它方法有assignNewStaterecycleStateaddStateTransitionremoveStateTransitiongetAllOutTransitionsgetAllInTransitionsgetEpsilonOutTransitionsgetEpsilonInTransitionsgetEpsilonArcsgetNonEpsilonOutTransitionsgetNonEpsilonInTransitionsgetNonEpsilonArcsallocateEntryrecycleEntryupdateEntrygetEntrylocateStateprintStatisticsprintStateWithExtprintStatelistStatesWithNFAStateSetlistStatesWithClosureStateSetpeekNextNewStateNumwriteXMLOutputassignNewState方法保留狀態(tài)表項(xiàng)目,并返回要用于新轉(zhuǎn)換狀態(tài)的相應(yīng)狀態(tài)號(hào)。recycleState方法允許調(diào)用程序?qū)顟B(tài)表項(xiàng)目釋放回到池中,以便重新分配。addStateTransition方法根據(jù)輸入轉(zhuǎn)換信息,來(lái)創(chuàng)建從當(dāng)前狀態(tài)到下一狀態(tài)的轉(zhuǎn)換弧。addStateTransition方法也創(chuàng)建相對(duì)于調(diào)用程序透明的從下一狀態(tài)返回到當(dāng)前狀態(tài)的反向鏈接。removeStateTransition方法刪除兩種狀態(tài)之間的轉(zhuǎn)換弧。removeStateTransition方法刪除關(guān)于兩種狀態(tài)之間的相同轉(zhuǎn)換的正向和反向鏈接。getAllOutTransitions方法把與指定狀態(tài)相關(guān)的所有外出轉(zhuǎn)換(outboundtransition)列表返回給調(diào)用程序。getAllInTransitions方法把與指定狀態(tài)相關(guān)的所有進(jìn)入轉(zhuǎn)換(inboundtransition)列表返回給調(diào)用程序。getEpsilonOutTransitions方法把與指定狀態(tài)相關(guān)的、由“空”輸入造成的外出厄普西隆轉(zhuǎn)換(outboundeplisontransition)列表返回給調(diào)用程序。getEpsilonInTransitions方法把與指定狀態(tài)相關(guān)的進(jìn)入厄普西隆轉(zhuǎn)換(inboundepsilontransition)列表返回給調(diào)用程序。getEpsilonArcs方法返回與從傳入的轉(zhuǎn)換列表中取出的厄普西隆輸入相關(guān)的轉(zhuǎn)換列表。該方法主要為支持getEpsilonOutTransitions和getEpsilonInTransitions方法而存在。getNonEpsilonOutTransitions方法向調(diào)用程序返回把與指定狀態(tài)相關(guān)的厄普西隆轉(zhuǎn)換排除在外的所有外出轉(zhuǎn)換列表。getNonEpsilonIutTransitions方法向調(diào)用程序返回把與指定狀態(tài)相關(guān)的厄普西隆轉(zhuǎn)換排除在外的所有進(jìn)入轉(zhuǎn)換列表。getNonEpsilonArcs方法返回與從傳入的轉(zhuǎn)換列表中取出的厄普西隆輸入不相關(guān)的轉(zhuǎn)換列表。該方法主要為支持getNonEpsilonOutTransitions和getNonEpsilonInTransitions方法而存在。allocateEntry方法從本地控制的狀態(tài)表項(xiàng)目矢量中分配狀態(tài)表項(xiàng)目。recycleEntry方法將狀態(tài)表項(xiàng)目放到要重新使用的狀態(tài)表項(xiàng)目列表上。updateEntry方法將狀態(tài)項(xiàng)信息復(fù)制到StateMgr類(lèi)對(duì)象內(nèi)部維護(hù)的狀態(tài)表矢量中的適當(dāng)位置中。getEntry方法從內(nèi)部狀態(tài)表矢量檢索與狀態(tài)相關(guān)的信息。locateState方法對(duì)DFA變換提供支持。如果存在為匹配輸入?yún)?shù)的一組NFA狀態(tài)而生成的匹配DFA狀態(tài),locateState方法將找到該匹配DFA狀態(tài)。printStatistics方法提供調(diào)試支持。printStatistics方法向屏幕打印出與內(nèi)部受控的狀態(tài)表相關(guān)的使用信息。printStateWithExt方法提供調(diào)試支持。printStateWithExt方法打印與具有為支持DFA變換而維護(hù)的附加信息的狀態(tài)相關(guān)的所有信息。printState方法提供調(diào)試支持。printState方法打印與狀態(tài)相關(guān)的所有信息。listStatesWithNFAStateSet方法返回包括指定NFA狀態(tài)集的DFA狀態(tài)列表。listStatesWithClosureStateSet方法返回作為厄普西隆閉包(epsilonclosure)一部分的狀態(tài)列表。peekNextNewStateNum方法返回要分配給下一新?tīng)顟B(tài)的狀態(tài)號(hào)。writeXMLOutput方法支持以XML格式將狀態(tài)表寫(xiě)出到輸出文件流。StateEntryStateEntry類(lèi)定義狀態(tài)表項(xiàng)目的內(nèi)容。狀態(tài)項(xiàng)包含三個(gè)主要字段狀態(tài)號(hào)、外出轉(zhuǎn)換弧列表、以及進(jìn)入轉(zhuǎn)換弧列表。有兩個(gè)為支持DFA變換而定義的附加字段被替代的NFA狀態(tài)集,以及空輸入轉(zhuǎn)換閉態(tài)集。類(lèi)構(gòu)造程序初始化字段,并創(chuàng)建關(guān)于外出弧和進(jìn)入弧的矢量。StateEntry類(lèi)支持狀態(tài)表項(xiàng)目的創(chuàng)建和維護(hù),StateEntry類(lèi)也定義以下方法addToArcaddFromArcremoveToArcremoveFromArcdoesTransitionExistremoveArccompareNFAStatesprintToArcsprintFromArcsprintArcprintExtensionisInNFAStateSetisInClosureStateSetwriteXMLOutputaddToArc方法把當(dāng)前狀態(tài)的外出轉(zhuǎn)換項(xiàng)添加到外出轉(zhuǎn)換弧矢量上。addFromArc方法把當(dāng)前狀態(tài)的進(jìn)入轉(zhuǎn)換項(xiàng)添加到進(jìn)入轉(zhuǎn)換弧矢量上。removeToArc方法從外出轉(zhuǎn)換弧矢量中刪除當(dāng)前狀態(tài)的外出轉(zhuǎn)換項(xiàng)。removeFromArc方法從進(jìn)入轉(zhuǎn)換弧矢量中刪除當(dāng)前狀態(tài)的進(jìn)入轉(zhuǎn)換項(xiàng)。doesTransitionExist方法允許調(diào)用程序執(zhí)行查詢(xún),以確定指定的轉(zhuǎn)換是否和外出轉(zhuǎn)換弧矢量中的任一轉(zhuǎn)換項(xiàng)匹配。removeArc方法支持removeToArc和removeFromArc方法從傳入的轉(zhuǎn)換弧矢量中刪除特殊轉(zhuǎn)換項(xiàng)。compareNFAStates方法比較輸入的NFA狀態(tài)集是否和正被當(dāng)前DFA狀態(tài)代替的NFA狀態(tài)集匹配。printToArcs方法提供調(diào)試支持,以便打印出當(dāng)前狀態(tài)的所有外出轉(zhuǎn)換弧的信息。printFromArcs方法提供調(diào)試支持,以便打印出當(dāng)前狀態(tài)的所有進(jìn)入轉(zhuǎn)換弧的信息。printArc方法支持printToArcs和printFromArcs方法向屏幕打印出傳入的轉(zhuǎn)換弧矢量中存儲(chǔ)的所有轉(zhuǎn)換項(xiàng)信息。printExtension方法提供調(diào)試支持,以便向屏幕打印出狀態(tài)項(xiàng)中維護(hù)的DFA變換支持信息。isInNFAStateSet方法提供DFA變換支持,以檢查在當(dāng)前狀態(tài)項(xiàng)內(nèi)維護(hù)的NFA狀態(tài)集中是否已經(jīng)包括特殊NFA狀態(tài)。isInClosureStateSet方法提供DFA變換支持,以檢查在當(dāng)前狀態(tài)項(xiàng)內(nèi)維護(hù)的空輸入閉態(tài)集中是否已經(jīng)包括特殊NFA狀態(tài)。writeXMLOutput方法支持以XML格式將狀態(tài)表項(xiàng)目寫(xiě)出到輸出文件。TransitionEntryTransitionEntry類(lèi)為用于描述從一種狀態(tài)轉(zhuǎn)到另一種狀態(tài)的轉(zhuǎn)換弧的信息,定義數(shù)據(jù)字段。該信息包括造成狀態(tài)轉(zhuǎn)換的輸入的類(lèi)型;造成狀態(tài)轉(zhuǎn)換的輸入的實(shí)際值;以及該狀態(tài)轉(zhuǎn)換所造成的下一狀態(tài)的狀態(tài)號(hào)。有六個(gè)類(lèi)構(gòu)造程序可用于初始化和設(shè)置適當(dāng)數(shù)據(jù)字段中的輸入數(shù)據(jù)信息,使得轉(zhuǎn)換項(xiàng)已準(zhǔn)備好使用。這些構(gòu)造程序具有不同的輸入?yún)?shù)來(lái)匹配轉(zhuǎn)換輸入數(shù)據(jù)類(lèi)型。為T(mén)ransitionEntry類(lèi)定義了以下允許調(diào)用程序訪(fǎng)問(wèn)和更新數(shù)據(jù)字段的方法clearsetSymbolNamesetInputsetTransitionsetCheckedFlaggetInputTypegetCharSetgetInputChargetTransitiongetSymbolNamegetCheckedFlagisEqualcompareInputcopyInputprintwriteXMLCharInputwriteXMLOutDutclear方法將所有數(shù)據(jù)字段都設(shè)置為一種初始已知狀態(tài)。setSymbolName方法將轉(zhuǎn)換輸入類(lèi)型設(shè)置為“RELOCATE”,以指示可能需要分支轉(zhuǎn)到另一狀態(tài)表來(lái)處理遞歸符號(hào)。符號(hào)名作為輸入?yún)?shù)被傳入,并且被保存在符號(hào)名字段中以便以后參考。setInput方法由三種重載方法組成,它們的不同之處僅在于輸入?yún)?shù)。第一種setInput型式不需要任何輸入。它把轉(zhuǎn)換項(xiàng)的轉(zhuǎn)換輸入類(lèi)型設(shè)置為空(厄普西隆)輸入。第二種型式需要字符輸入?yún)?shù)。該方法將轉(zhuǎn)換項(xiàng)輸入類(lèi)型設(shè)置為字符類(lèi)型,并保存輸入字符值。第三種型式需要CharSet輸入?yún)?shù)。它將轉(zhuǎn)換項(xiàng)輸入類(lèi)型設(shè)置為CharSet,并保存CharSet值。setTransition方法允許調(diào)用程序指定要轉(zhuǎn)到的轉(zhuǎn)換狀態(tài)號(hào)。setCheckedFlag方法支持DFA變換。它允許DFA變換處理標(biāo)明該轉(zhuǎn)換項(xiàng),使得該項(xiàng)只被處理一次,以便加速變換。getInputType方法把該轉(zhuǎn)換項(xiàng)的輸入類(lèi)型返回給調(diào)用程序。getCharSet方法把該轉(zhuǎn)換項(xiàng)的輸入CharSet值返回給調(diào)用程序。getInputChar方法把該轉(zhuǎn)換項(xiàng)的輸入字符值返回給調(diào)用程序。getTransition方法返回該轉(zhuǎn)換項(xiàng)中指定的轉(zhuǎn)換狀態(tài)號(hào)。getSymbolName方法把該項(xiàng)中存儲(chǔ)的輸入符號(hào)值返回給調(diào)用程序。getCheckedFlag方法把該項(xiàng)中的CheckedFlag當(dāng)前標(biāo)志設(shè)置返回給調(diào)用程序。isEqual方法對(duì)包括作為輸入?yún)?shù)傳入的轉(zhuǎn)換項(xiàng)中存儲(chǔ)的轉(zhuǎn)換狀態(tài)信息的所有值和該轉(zhuǎn)換項(xiàng)中存儲(chǔ)的那些值進(jìn)行比較。如果這些值相同,則isEqual方法返回真;否則,返回假。compareInput方法對(duì)作為輸入?yún)?shù)傳入的轉(zhuǎn)換項(xiàng)中存儲(chǔ)的輸入類(lèi)型及輸入值和該轉(zhuǎn)換項(xiàng)中存儲(chǔ)的輸入類(lèi)型及輸入值進(jìn)行比較。如果這些值相同,則compareInput方法返回真;否則,返回假。copyInput方法允許調(diào)用程序把輸入類(lèi)型和輸入值信息從作為輸入?yún)?shù)傳入的轉(zhuǎn)換項(xiàng)復(fù)制到當(dāng)前項(xiàng)。print方法提供調(diào)試支持,以便向屏幕打印出該轉(zhuǎn)換項(xiàng)的內(nèi)容。writeXMLCharInput方法通過(guò)確定輸入字符是否為可打印ASCII字符,來(lái)支持writeXMLOutput方法,并以適當(dāng)?shù)腦ML格式將輸入字符輸出到輸出文件流。writeXMLOutput方法支持以XML格式將狀態(tài)轉(zhuǎn)換信息寫(xiě)出到輸出文件流。DFAMgrDFAMgr類(lèi)支持將NFA變換為DFA。DFAMgr類(lèi)構(gòu)造程序接收包含要被變換為DFA的NFA狀態(tài)表的NFAMgr,作為輸入。DFAMgr類(lèi)構(gòu)造程序還需要兩個(gè)附加參數(shù)來(lái)指定NFA起始狀態(tài)和NFA最終狀態(tài),使得DFAMgr能夠?qū)⑺鼈冇成錇镈FA起始狀態(tài)和DFA最終狀態(tài)。構(gòu)造程序創(chuàng)建新StateMgr,來(lái)維護(hù)要產(chǎn)生的新DFA狀態(tài)。在DFAMgr類(lèi)對(duì)象被構(gòu)造之后,調(diào)用程序可以調(diào)用NFA2DFA方法來(lái)執(zhí)行DFA變換。以下是DFAMgr所定義的方法列表createDFAStateNFA2DFAaddEpsilonOutStateseClosuregetNFATransitionSetextractNFAInputSetextractNFATargetStateSetfindDFAFinalStatesprintFinalStateswriteXMLOutputcreateDFAState方法支持NFA2DFA方法執(zhí)行DFA變換。createDFAState方法為新DFA狀態(tài)創(chuàng)建狀態(tài)表項(xiàng)目。在創(chuàng)建狀態(tài)項(xiàng)之后,createDFAState方法用關(guān)聯(lián)的NFA狀態(tài)集和厄普西隆閉集來(lái)初始化狀態(tài)項(xiàng)。NFA2DFA方法是用于執(zhí)行將NFA變換為DFA的主要方法。NFA2DFA方法使用某些公知編譯器構(gòu)造技術(shù)來(lái)將NFA變換為DFA。addEpsilonOutStates是一種為支持eClosure方法而存在的遞歸方法。addEpsilonOutStates方法以一種遞歸方式將厄普西隆(空輸入)轉(zhuǎn)換狀態(tài)添加到來(lái)源于被映射到DFA狀態(tài)的NFA狀態(tài)集的閉集。eClosure方法建立并返回與作為輸入?yún)?shù)傳入的NFA狀態(tài)集關(guān)聯(lián)的厄普西隆閉態(tài)集。getNFATransitionSet方法建立并返回與作為輸入?yún)?shù)傳入的狀態(tài)集關(guān)聯(lián)的非厄普西隆轉(zhuǎn)換項(xiàng)集合。extractNFAInputSet方法查看作為輸入?yún)?shù)傳入的轉(zhuǎn)換項(xiàng)集合,并把從這些轉(zhuǎn)換項(xiàng)中提取的輸入集返回給調(diào)用程序。extractNFATargetStateSet方法查看作為第一輸入?yún)?shù)傳入的轉(zhuǎn)換項(xiàng)集合,并返回具有與作為該方法第二輸入?yún)?shù)傳入的轉(zhuǎn)換項(xiàng)中指定的輸入匹配的輸入的目標(biāo)狀態(tài)集。findDFAFinalStates方法返回被指定為DFA狀態(tài)表中允許最終狀態(tài)的DFA狀態(tài)集。該DFA狀態(tài)集是根據(jù)作為輸入?yún)?shù)傳入的原始NFA最終狀態(tài)來(lái)確定的。printFinalStates方法提供調(diào)試支持,以便向屏幕打印出如通過(guò)NFA2DFA方法確定的DFA最終狀態(tài)集。writeXMLOutput方法支持以XML格式把與DFAMgr創(chuàng)建的DFA相對(duì)應(yīng)的狀態(tài)表寫(xiě)出到輸出文件流。參考圖6,圖6顯示了被表示為XML文件的狀態(tài)轉(zhuǎn)換規(guī)范輸出的例子。600的文件頭識(shí)別文件內(nèi)容、產(chǎn)生文件的日期、以及語(yǔ)法規(guī)則輸入源。610的文件下一部分提供某些關(guān)于被指定的狀態(tài)表的身份和布局的一般信息。在611,它識(shí)別該文件中描述的邏輯狀態(tài)表數(shù)。加載器可以通過(guò)把來(lái)自后續(xù)邏輯狀態(tài)表的狀態(tài)附加到第一邏輯狀態(tài)表上,并據(jù)此調(diào)節(jié)它們的轉(zhuǎn)換,來(lái)把這些邏輯狀態(tài)表組合成一個(gè)單物理狀態(tài)表。(例如,如果物理狀態(tài)表中的當(dāng)前最后狀態(tài)是1205。物理狀態(tài)表中的下一可用狀態(tài)項(xiàng)是1206。為了將下一邏輯狀態(tài)表附加到物理狀態(tài)表上,把在邏輯上被標(biāo)定為狀態(tài)0的初始狀態(tài)加載到物理狀態(tài)表項(xiàng)1206上。從邏輯狀態(tài)表的所有狀態(tài)轉(zhuǎn)換都將被調(diào)節(jié)1206的偏移量。因此,如果有到邏輯狀態(tài)表的狀態(tài)5的轉(zhuǎn)換,則在物理狀態(tài)表中該轉(zhuǎn)換將變?yōu)?211(1206+5)。)在612,它識(shí)別邏輯表的名稱(chēng)。遞歸符號(hào)它們自己用作遞歸符號(hào)邏輯狀態(tài)表的名稱(chēng)。在613,它提供用于標(biāo)定物理狀態(tài)表列(狀態(tài)輸入)的信息。620的文件下一段提供關(guān)于每個(gè)邏輯狀態(tài)表的詳細(xì)規(guī)范。621的部分提供對(duì)該文件所指定的邏輯狀態(tài)表的完整描述。它通過(guò)622的名稱(chēng)來(lái)識(shí)別表。然后,它在623識(shí)別該狀態(tài)表的邏輯初始狀態(tài)。624列出了允許最終狀態(tài)。625指定了該邏輯狀態(tài)表的狀態(tài)數(shù)。626的文件部分識(shí)別該邏輯狀態(tài)表的所有不同狀態(tài)及其轉(zhuǎn)換的詳細(xì)信息。它首先提供如627所示的邏輯狀態(tài)號(hào)。然后,它在628列出在各種輸入的情況下,來(lái)源于該狀態(tài)的所有轉(zhuǎn)換。在629識(shí)別具有到該邏輯狀態(tài)的轉(zhuǎn)換的狀態(tài)。對(duì)邏輯狀態(tài)表中的每種狀態(tài)都重復(fù)626的文件部分。并且,對(duì)每一邏輯狀態(tài)表都重復(fù)在621指定的信息。這向加載器提供用于使硬件加速器個(gè)性化的完整信息。由以上描述來(lái)看,可以看到,本發(fā)明能夠優(yōu)選地以諸如BNF或其派生物的形式記號(hào),直接自動(dòng)地從語(yǔ)言或功能規(guī)范、為任何計(jì)算機(jī)語(yǔ)言或其它目的提供無(wú)差錯(cuò)狀態(tài)表數(shù)據(jù)。過(guò)程可以迅速地執(zhí)行,并以低成本產(chǎn)生無(wú)差錯(cuò)狀態(tài)表。從而,本發(fā)明允許隨意迅速地改變FSM的個(gè)性,以適應(yīng)或提供不同功能、或反映所關(guān)心的不同語(yǔ)言或字符串。雖然用單個(gè)優(yōu)選實(shí)施例描述了本發(fā)明,但是本領(lǐng)域技術(shù)人員應(yīng)該認(rèn)識(shí)到,可以在所附權(quán)利要求的精神和范圍進(jìn)行修改來(lái)實(shí)施本發(fā)明。權(quán)利要求1.一種以自描述格式提供狀態(tài)表的方法,所述方法包括以下步驟提供可執(zhí)行功能的規(guī)范,辨別與各個(gè)所述可執(zhí)行功能相對(duì)應(yīng)的標(biāo)記,將標(biāo)記變換為確定性有限自動(dòng)機(jī),以及將所述確定性有限自動(dòng)機(jī)變換為狀態(tài)表項(xiàng)目。2.根據(jù)權(quán)利要求1所述的方法,其中,所述變換所述確定性有限自動(dòng)機(jī)的步驟包括形成字符串。3.根據(jù)權(quán)利要求1所述的方法,包括進(jìn)一步的步驟在所述可執(zhí)行功能的規(guī)范中檢測(cè)表示特殊規(guī)則的語(yǔ)法實(shí)體。4.根據(jù)權(quán)利要求3所述的方法,其中,所述特殊規(guī)則包括“排除”操作。5.根據(jù)權(quán)利要求3所述的方法,其中,檢測(cè)到的語(yǔ)法實(shí)體是遞歸的。6.根據(jù)權(quán)利要求5所述的方法,包括進(jìn)一步的步驟產(chǎn)生與遞歸語(yǔ)法實(shí)體相對(duì)應(yīng)的一組有限自動(dòng)機(jī)。7.根據(jù)權(quán)利要求5所述的方法,包括進(jìn)一步的步驟將遞歸符號(hào)存儲(chǔ)在遞歸符號(hào)表中。8.根據(jù)權(quán)利要求5所述的方法,其中,遞歸語(yǔ)法實(shí)體是定界符符號(hào)。9.根據(jù)權(quán)利要求1所述的方法,其中,所述變換標(biāo)記的步驟包括進(jìn)一步的步驟檢測(cè)與各個(gè)所述標(biāo)記相對(duì)應(yīng)的非確定性有限自動(dòng)機(jī)。10.根據(jù)權(quán)利要求9所述的方法,其中,所述變換標(biāo)記的步驟包括進(jìn)一步的步驟將非確定性有限自動(dòng)機(jī)變換為確定性有限自動(dòng)機(jī)。11.根據(jù)權(quán)利要求10所述的方法,其中,所述變換非確定性有限自動(dòng)機(jī)的步驟包括進(jìn)一步的步驟從所述非確定性有限自動(dòng)機(jī)的狀態(tài)形成閉集。12.根據(jù)權(quán)利要求5所述的方法,其中,所述變換標(biāo)記的步驟包括進(jìn)一步的步驟檢測(cè)與各個(gè)所述標(biāo)記相對(duì)應(yīng)的非確定性有限自動(dòng)機(jī)。13.根據(jù)權(quán)利要求12所述的方法,其中,所述變換標(biāo)記的步驟包括進(jìn)一步的步驟將非確定性有限自動(dòng)機(jī)變換為確定性有限自動(dòng)機(jī)。14.根據(jù)權(quán)利要求13所述的方法,其中,所述變換非確定性有限自動(dòng)機(jī)的步驟包括進(jìn)一步的步驟從所述非確定性有限自動(dòng)機(jī)的狀態(tài)產(chǎn)生閉集。15.根據(jù)權(quán)利要求1所述的方法,其包括進(jìn)一步的步驟優(yōu)化確定性有限自動(dòng)機(jī)。16.根據(jù)權(quán)利要求6所述的方法,包括進(jìn)一步的步驟優(yōu)化確定性有限自動(dòng)機(jī)。17.根據(jù)權(quán)利要求10所述的方法,包括進(jìn)一步步驟優(yōu)化確定性有限自動(dòng)機(jī)的。18.根據(jù)權(quán)利要求1所述的方法,其中,所述變換標(biāo)記和變換確定性有限自動(dòng)機(jī)的步驟是作為單一無(wú)分支序列被執(zhí)行的。19.一種個(gè)性編譯器,包括用于輸入可由數(shù)據(jù)處理器執(zhí)行的功能的規(guī)范的裝置,所述規(guī)范包括語(yǔ)法實(shí)體,用于從所述規(guī)范中的標(biāo)記來(lái)產(chǎn)生有限自動(dòng)機(jī)的裝置,包括用于為遞歸語(yǔ)法實(shí)體產(chǎn)生一組有限自動(dòng)機(jī)的裝置,用于從非確定性有限自動(dòng)機(jī)的狀態(tài)來(lái)產(chǎn)生閉集,以形成確定性有限自動(dòng)機(jī)的裝置,以及用于將所述確定性有限自動(dòng)機(jī)變換為狀態(tài)表項(xiàng)目,以定義有限狀態(tài)機(jī)的裝置。20.根據(jù)權(quán)利要求19所述的個(gè)性編譯器,進(jìn)一步包括加載器,用于將所述狀態(tài)表項(xiàng)目加載到所述有限狀態(tài)機(jī)中,所述加載器包括用于存儲(chǔ)和輸出與所述遞歸語(yǔ)法實(shí)體相對(duì)應(yīng)的所述有限自動(dòng)機(jī)集合的堆棧。21.一種硬件語(yǔ)法分析程序加速器,包括有限狀態(tài)機(jī),加載器,用于將狀態(tài)表數(shù)據(jù)加載到所述有限狀態(tài)機(jī)中,以及個(gè)性編譯器,所述個(gè)性編譯器包括用于輸入可由數(shù)據(jù)處理器執(zhí)行的功能的規(guī)范的裝置,所述規(guī)范包括語(yǔ)法實(shí)體,用于從所述規(guī)范中的標(biāo)記來(lái)產(chǎn)生有限自動(dòng)機(jī)的裝置,包括用于為遞歸語(yǔ)法實(shí)體產(chǎn)生一組有限自動(dòng)機(jī)的裝置,用于從非確定性有限自動(dòng)機(jī)的狀態(tài)來(lái)產(chǎn)生閉集,以形成確定性有限自動(dòng)機(jī)的裝置,以及用于將所述確定性有限自動(dòng)機(jī)變換為狀態(tài)表項(xiàng)目,以定義有限狀態(tài)機(jī)的裝置。22.根據(jù)權(quán)利要求21所述的硬件語(yǔ)法分析程序加速器,其中,所述加載器包括堆棧,用于存儲(chǔ)和輸出與所述遞歸語(yǔ)法實(shí)體相對(duì)應(yīng)的所述有限自動(dòng)機(jī)集合。23.根據(jù)權(quán)利要求21所述的硬件語(yǔ)法分析程序加速器,其中,個(gè)性編譯器和加載器基本上實(shí)時(shí)地操作,來(lái)改變所述有限狀態(tài)機(jī)的狀態(tài)表。24.根據(jù)權(quán)利要求23所述的硬件語(yǔ)法分析程序加速器,其中,所述有限狀態(tài)機(jī)的加載隨著時(shí)間過(guò)去而響應(yīng)在輸入數(shù)據(jù)流中觀(guān)測(cè)的條件,來(lái)適應(yīng)所述語(yǔ)法分析程序加速器和所述個(gè)性編譯器。25.根據(jù)權(quán)利要求21所述的硬件語(yǔ)法分析程序加速器,其中,當(dāng)所述硬件語(yǔ)法分析程序離線(xiàn)并為有限自動(dòng)機(jī)或狀態(tài)表形式的結(jié)果提供存儲(chǔ),并且所述加載器基于請(qǐng)求方式被操作時(shí),所述個(gè)性編譯器的一部分被操作。全文摘要一種硬件加速器個(gè)性編譯器,通過(guò)辨別與各個(gè)可執(zhí)行功能、標(biāo)識(shí)、變?cè)?、句法、語(yǔ)法規(guī)則、特殊符號(hào)等相對(duì)應(yīng)的標(biāo)記,從如在編程語(yǔ)言中以諸如Backus-Naur形式或其派生形式的形式記號(hào)提供的一組預(yù)期可執(zhí)行功能的規(guī)范、自動(dòng)地產(chǎn)生無(wú)差錯(cuò)狀態(tài)表。標(biāo)記可以是遞歸的(例如無(wú)限的),在該情況下標(biāo)記被變換為確定性有限自動(dòng)機(jī)或非確定性有限自動(dòng)機(jī)。非確定性有限自動(dòng)機(jī)被變換為有限自動(dòng)機(jī),然后被變換為用于創(chuàng)建狀態(tài)表的狀態(tài)轉(zhuǎn)換,然后該狀態(tài)表能夠被存儲(chǔ)、或優(yōu)選地被加載到硬件語(yǔ)法分析程序加速器的有限狀態(tài)機(jī)中,以定義其個(gè)性。文檔編號(hào)G06F9/44GK1781078SQ200380110287公開(kāi)日2006年5月31日申請(qǐng)日期2003年10月3日優(yōu)先權(quán)日2003年2月28日發(fā)明者邁克爾·C·達(dá)普,賽·倫·額申請(qǐng)人:洛克希德馬丁公司