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