亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

字符串對(duì)照裝置及字符串對(duì)照程序的制作方法

文檔序號(hào):6508427閱讀:251來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):字符串對(duì)照裝置及字符串對(duì)照程序的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種用于進(jìn)行利用正規(guī)表達(dá)指定的模式與文章中的文本的對(duì)照的技術(shù)。
背景技術(shù)
近年來(lái)人們?cè)诟鞣N領(lǐng)域中推進(jìn)文檔的電子化,尋求文檔的高效檢索方法。作為檢索的一種方法,存在進(jìn)行利用正規(guī)表達(dá)指定的模式與文檔中的文本的對(duì)照的方法。所謂正規(guī)表達(dá)例如記載在非專(zhuān)利文獻(xiàn)1中,是表達(dá)被稱(chēng)為正規(guī)語(yǔ)言的語(yǔ)言的類(lèi)(class)的表述方法。作為將正規(guī)表達(dá)作為檢索條件的字符串對(duì)照方式,已知基于DFA(DeterministicFinite Automaton,確定性有限自動(dòng)機(jī))的方法。
基于DFA的字符串對(duì)照方式是基于狀態(tài)轉(zhuǎn)變機(jī)器(自動(dòng)機(jī))的模型。狀態(tài)轉(zhuǎn)變機(jī)器在內(nèi)部具有狀態(tài)和狀態(tài)轉(zhuǎn)變函數(shù)。狀態(tài)轉(zhuǎn)變函數(shù)是針對(duì)當(dāng)前狀態(tài)和輸入字符確定下一個(gè)狀態(tài)的函數(shù)。在使用DFA的字符串對(duì)照方式中,逐個(gè)字符地讀出輸入文本,轉(zhuǎn)變成針對(duì)當(dāng)前狀態(tài)和輸入字符的組應(yīng)用狀態(tài)轉(zhuǎn)變函數(shù)所得到的下一個(gè)狀態(tài)。根據(jù)該方法,可以通過(guò)不回溯地掃描一次文本來(lái)執(zhí)行對(duì)照,從而可執(zhí)行高速的字符串對(duì)照。在執(zhí)行基于多個(gè)條件的對(duì)照時(shí),為了區(qū)別對(duì)照成功的條件,還使用擴(kuò)展DFA并對(duì)各狀態(tài)定義輸出的帶輸出的有限自動(dòng)機(jī)(Moore機(jī)器)。
DFA的狀態(tài)轉(zhuǎn)變函數(shù)由作為對(duì)照條件的正規(guī)表達(dá)來(lái)決定,但目前已知的是將正規(guī)表達(dá)一次變換成NFA(Non-deterministic FiniteAutomaton,非確定性有限自動(dòng)機(jī)),并進(jìn)一步將NFA變換成DFA的過(guò)程,例如記載在非專(zhuān)利文獻(xiàn)1等中?;贒FA的字符串對(duì)照方式具有高速的優(yōu)點(diǎn),但另一方面,具有用于實(shí)現(xiàn)DFA的狀態(tài)轉(zhuǎn)變函數(shù)的狀態(tài)轉(zhuǎn)變表容易變得巨大的缺點(diǎn)。
作為一例,以專(zhuān)利文獻(xiàn)3中公開(kāi)的圖52的對(duì)照條件為例。圖53是在現(xiàn)有的帶輸出的有限自動(dòng)機(jī)中根據(jù)圖52的對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表及失敗函數(shù)。這樣,必須針對(duì)狀態(tài)數(shù)18和字符類(lèi)別的5個(gè)種類(lèi),生成保持90個(gè)組的狀態(tài)轉(zhuǎn)變表。
作為解決該問(wèn)題的方法,在專(zhuān)利文獻(xiàn)1、專(zhuān)利文獻(xiàn)2中示出如下方法在將基于AC(Aho-Corasick)法的狀態(tài)轉(zhuǎn)變表變換成DFA之后,從狀態(tài)轉(zhuǎn)變表中去掉向初始狀態(tài)的轉(zhuǎn)變操作以及向初始狀態(tài)的下一個(gè)狀態(tài)的轉(zhuǎn)變操作,從而削減狀態(tài)轉(zhuǎn)變表的存儲(chǔ)容量。但是,在專(zhuān)利文獻(xiàn)1、專(zhuān)利文獻(xiàn)2中示出的字符串對(duì)照方法中,由于將對(duì)照的對(duì)象限定于固定的字符串關(guān)鍵字,所以不能以一般的正規(guī)表達(dá)作為對(duì)照的對(duì)象。
另外,在專(zhuān)利文獻(xiàn)3中示出在DFA中通過(guò)定義失敗函數(shù)來(lái)削減狀態(tài)轉(zhuǎn)變表的方法。但是,專(zhuān)利文獻(xiàn)3中示出的方法在利用失敗函數(shù)轉(zhuǎn)變一次后的狀態(tài)下有時(shí)會(huì)再次轉(zhuǎn)變失敗。即,有時(shí)會(huì)連鎖產(chǎn)生轉(zhuǎn)變的失敗。這時(shí),存在必須重復(fù)參照失敗函數(shù)、對(duì)照速度降低的問(wèn)題。
作為一例,以專(zhuān)利文獻(xiàn)3中公開(kāi)的圖52的對(duì)照條件為例。圖54是根據(jù)圖52的對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表及失敗函數(shù),公開(kāi)在專(zhuān)利文獻(xiàn)3中。
以對(duì)照條件是圖52的條件、輸入字符串是“aaca”的情況為例。
在專(zhuān)利文獻(xiàn)3中公開(kāi)的方法中,首先,將狀態(tài)初始化成狀態(tài)1。接著,首先讀第1個(gè)字符“a”,轉(zhuǎn)變成在狀態(tài)轉(zhuǎn)變表的狀態(tài)1的行、輸入字符“a”的列中示出的狀態(tài)3。接著,讀第2個(gè)字符“a”,同樣地,從狀態(tài)3轉(zhuǎn)變成狀態(tài)6。接著,通過(guò)讀第個(gè)3字符“c”,從狀態(tài)6轉(zhuǎn)變成狀態(tài)10。但是,接著在第4個(gè)字符的字符“a”出現(xiàn)時(shí),由于在狀態(tài)10下不存在對(duì)應(yīng)于字符“a”的轉(zhuǎn)變目標(biāo),所以首先轉(zhuǎn)變成作為狀態(tài)10失敗時(shí)的轉(zhuǎn)變目標(biāo)的狀態(tài)5。并且,由于在狀態(tài)5下不存在對(duì)應(yīng)于字符“a”的轉(zhuǎn)變目標(biāo),所以轉(zhuǎn)變成作為狀態(tài)5失敗時(shí)的轉(zhuǎn)變目標(biāo)的狀態(tài)2??墒牵捎谠跔顟B(tài)2下也不存在對(duì)應(yīng)于字符“a”的轉(zhuǎn)變目標(biāo),所以轉(zhuǎn)變成作為狀態(tài)2失敗時(shí)的轉(zhuǎn)變目標(biāo)的狀態(tài)1。由于在狀態(tài)1下存在對(duì)應(yīng)于字符“a”的轉(zhuǎn)變目標(biāo)狀態(tài)3,所以轉(zhuǎn)變成狀態(tài)3。這樣,對(duì)于第4個(gè)字符的輸入字符共計(jì)執(zhí)行了4次狀態(tài)轉(zhuǎn)變表的參照和狀態(tài)轉(zhuǎn)變,從而整體上對(duì)于4個(gè)字符的輸入字符需要7次狀態(tài)轉(zhuǎn)變。這樣,專(zhuān)利文獻(xiàn)3的方法有時(shí)需要進(jìn)行重復(fù)狀態(tài)轉(zhuǎn)變的失敗、每次都參照失敗時(shí)的轉(zhuǎn)變目標(biāo)的動(dòng)作。因此,存在狀態(tài)轉(zhuǎn)變表的參照次數(shù)增加、對(duì)照性能降低的問(wèn)題。
非專(zhuān)利文獻(xiàn)1E.J.Hopcroft,D.J.Ullman,“Formal Languagesand their Relation to Automata”,Addison Wesley(1969)專(zhuān)利文獻(xiàn)1特開(kāi)2004-103035號(hào)公報(bào)專(zhuān)利文獻(xiàn)2特開(kāi)2004-103034號(hào)公報(bào)專(zhuān)利文獻(xiàn)3特許第2994926號(hào)公報(bào)發(fā)明內(nèi)容發(fā)明所要解決的技術(shù)問(wèn)題本發(fā)明為了解決上述問(wèn)題而作出,其目的在于針對(duì)以正規(guī)表達(dá)為對(duì)照條件的字符串對(duì)照,削減存儲(chǔ)狀態(tài)轉(zhuǎn)變表所需的存儲(chǔ)容量。
另外,其目的在于使由于轉(zhuǎn)變失敗所引起的狀態(tài)轉(zhuǎn)變表的參照次數(shù)為每1個(gè)字符2次以下,防止由于重復(fù)轉(zhuǎn)變的失敗所引起的性能降低,從而可執(zhí)行高速的字符串對(duì)照。
解決技術(shù)問(wèn)題的技術(shù)方案本發(fā)明的字符串對(duì)照裝置具備狀態(tài)轉(zhuǎn)變表生成部,根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件,生成狀態(tài)轉(zhuǎn)變表;和自動(dòng)機(jī),根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變,其中,當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述自動(dòng)機(jī)不繼續(xù)讀入輸入字符,而是轉(zhuǎn)變到初始狀態(tài)。
發(fā)明效果具備根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件生成狀態(tài)轉(zhuǎn)變表的狀態(tài)轉(zhuǎn)變表生成部、和根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變的自動(dòng)機(jī),當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述自動(dòng)機(jī)不繼續(xù)讀入輸入字符而是轉(zhuǎn)變至初始狀態(tài),由此可削減存儲(chǔ)狀態(tài)轉(zhuǎn)變表所需的存儲(chǔ)容量。


圖1是表示字符串對(duì)照裝置的結(jié)構(gòu)的說(shuō)明圖。
圖2是表示對(duì)照條件2的構(gòu)成的說(shuō)明圖。
圖3是表示條件式17的構(gòu)成的說(shuō)明圖。
圖4是表示狀態(tài)轉(zhuǎn)變表生成部3的構(gòu)成的說(shuō)明圖。
圖5是表示狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4的構(gòu)成的說(shuō)明圖。
圖6是表示輸出表存儲(chǔ)部5的結(jié)構(gòu)的說(shuō)明圖。
圖7是表示對(duì)照結(jié)果10的構(gòu)成的說(shuō)明圖。
圖8是表示字符串對(duì)照裝置的動(dòng)作的流程圖。
圖9是表示對(duì)照條件的編譯動(dòng)作的流程圖。
圖10是表示追加向初始狀態(tài)的失敗轉(zhuǎn)變的流程的流程圖。
圖11是表示追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起不存在基于σany的轉(zhuǎn)變目標(biāo)的情況)的流程的流程圖。
圖12是表示追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)的情況)的流程的流程圖。
圖13是表示除去非確定性轉(zhuǎn)變的流程的流程圖。
圖14是表示進(jìn)行狀態(tài)集合的初始化的流程的流程圖。
圖15是表示除去與Σ有關(guān)的非確定性轉(zhuǎn)變的流程的流程圖。
圖16是表示除去與σother有關(guān)的非確定性轉(zhuǎn)變的流程的流程圖。
圖17是表示生成新?tīng)顟B(tài)的流程的流程圖。
圖18是表示修正基于σother的狀態(tài)轉(zhuǎn)變的流程的流程圖。
圖19是表示除去未使用狀態(tài)的流程的流程圖。
圖20是表示除去冗余狀態(tài)的流程的流程圖。
圖21是表示刪除冗余的狀態(tài)轉(zhuǎn)變的流程的流程圖。
圖22是表示生成狀態(tài)轉(zhuǎn)變表和輸出表的流程的流程圖。
圖23是表示對(duì)照輸入文檔的流程的流程圖。
圖24是說(shuō)明元字符“.”的置換的說(shuō)明圖。
圖25是說(shuō)明元字符“^”的置換的說(shuō)明圖。
圖26是說(shuō)明包含向初始狀態(tài)的ε轉(zhuǎn)變的NFA的說(shuō)明圖。
圖27是說(shuō)明ε轉(zhuǎn)變的省略的說(shuō)明圖。
圖28是說(shuō)明必須追加失敗轉(zhuǎn)變的情況的說(shuō)明圖。
圖29是說(shuō)明追加失敗轉(zhuǎn)變的說(shuō)明圖。
圖30是說(shuō)明從初始狀態(tài)起存在基于σany的轉(zhuǎn)變的情況的說(shuō)明圖。
圖31是說(shuō)明從初始狀態(tài)起存在基于σany的轉(zhuǎn)變時(shí)追加失敗轉(zhuǎn)變的說(shuō)明圖。
圖32是說(shuō)明除去非確定性轉(zhuǎn)變(除去前)的說(shuō)明圖。
圖33是說(shuō)明除去非確定性轉(zhuǎn)變(除去后)的說(shuō)明圖。
圖34是說(shuō)明除去非確定性轉(zhuǎn)變(除去前)的說(shuō)明圖。
圖35是說(shuō)明除去非確定性轉(zhuǎn)變(除去后)的說(shuō)明圖。
圖36是說(shuō)明除去非確定性轉(zhuǎn)變(除去前)的說(shuō)明圖。
圖37是說(shuō)明除去非確定性轉(zhuǎn)變(除去后)的說(shuō)明圖。
圖38是說(shuō)明除去非確定性轉(zhuǎn)變(除去前)的說(shuō)明圖。
圖39是說(shuō)明除去非確定性轉(zhuǎn)變(除去后)的說(shuō)明圖。
圖40是說(shuō)明除去非確定性轉(zhuǎn)變(除去前)的說(shuō)明圖。
圖41是說(shuō)明除去非確定性轉(zhuǎn)變(除去后)的說(shuō)明圖。
圖42是說(shuō)明刪除冗余的狀態(tài)轉(zhuǎn)變的說(shuō)明圖。
圖43是說(shuō)明合并冗余狀態(tài)的說(shuō)明圖。
圖44是表示對(duì)照條件的結(jié)構(gòu)的說(shuō)明圖。
圖45是表示狀態(tài)轉(zhuǎn)變表的結(jié)構(gòu)的說(shuō)明圖。
圖46是表示輸出表的結(jié)構(gòu)的說(shuō)明圖。
圖47是表示動(dòng)作例的說(shuō)明圖。
圖48是表示對(duì)照條件的結(jié)構(gòu)的說(shuō)明圖。
圖49是表示狀態(tài)轉(zhuǎn)變表的結(jié)構(gòu)的說(shuō)明圖。
圖50是表示輸出表的結(jié)構(gòu)的說(shuō)明圖。
圖51是表示動(dòng)作例的說(shuō)明圖。
圖52是專(zhuān)利文獻(xiàn)3中公開(kāi)的對(duì)照條件。
圖53是基于專(zhuān)利文獻(xiàn)3的現(xiàn)有的帶輸出的DFA的狀態(tài)轉(zhuǎn)變表。
圖54是基于專(zhuān)利文獻(xiàn)3的現(xiàn)有的狀態(tài)轉(zhuǎn)變表和輸出表。
符號(hào)說(shuō)明1、字符串對(duì)照裝置2、對(duì)照條件3、狀態(tài)轉(zhuǎn)變表生成部4、狀態(tài)轉(zhuǎn)變表存儲(chǔ)部5、輸出表存儲(chǔ)部6、輸入文檔7、輸入字符讀取部8、SDFA自動(dòng)機(jī)9、狀態(tài)存儲(chǔ)部10、對(duì)照結(jié)果11、狀態(tài)轉(zhuǎn)變12、輸出描述13、當(dāng)前狀態(tài)14、輸入字符15、下一個(gè)狀態(tài)16、條件編號(hào)17、條件式18、條件描述21、狀態(tài)轉(zhuǎn)變表生成控制部22、NFA狀態(tài)集合23、NFA狀態(tài)轉(zhuǎn)變集合
24、NFA輸出描述集合25、狀態(tài)集合26、狀態(tài)轉(zhuǎn)變集合27、輸出描述集合31、散列值計(jì)算部32、散列值33、狀態(tài)轉(zhuǎn)變散列指針34、狀態(tài)轉(zhuǎn)變散列鏈35、狀態(tài)轉(zhuǎn)變散列表36、比較部41、條件編號(hào)索引42、條件編號(hào)鏈具體實(shí)施方式
實(shí)施例1圖1是表示本發(fā)明的字符串對(duì)照裝置的結(jié)構(gòu)圖。
在圖1中,字符串對(duì)照裝置1是本發(fā)明的執(zhí)行基于正規(guī)表達(dá)的字符串對(duì)照的裝置,作為對(duì)照結(jié)果10,輸出在輸入文檔6中是否包含滿(mǎn)足對(duì)照條件2的字符串。對(duì)照條件2是描述了字符串對(duì)照條件的條件,成為字符串對(duì)照裝置1的輸入。狀態(tài)轉(zhuǎn)變表生成部3根據(jù)對(duì)照條件2生成狀態(tài)轉(zhuǎn)變11和輸出描述12,分別送給狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4、輸出表存儲(chǔ)部5。狀態(tài)變換表存儲(chǔ)部保持狀態(tài)轉(zhuǎn)變11的組。輸出表存儲(chǔ)部5保持輸出描述12。輸入文檔6是成為對(duì)照對(duì)象的文檔。輸入字符讀取部7逐個(gè)字符地取出包含在輸入文檔6中的字符,作為輸入字符14發(fā)送給SDFA自動(dòng)機(jī)8。SDFA自動(dòng)機(jī)8在內(nèi)部的狀態(tài)存儲(chǔ)部9中存儲(chǔ)當(dāng)前狀態(tài)13,從輸入字符讀取部7獲取輸入字符14,參照狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4、輸出表存儲(chǔ)部5,更新存儲(chǔ)在狀態(tài)存儲(chǔ)部9中的當(dāng)前狀態(tài)13和輸出對(duì)照結(jié)果10。狀態(tài)存儲(chǔ)部9存儲(chǔ)保持在SDFA自動(dòng)機(jī)8內(nèi)部的狀態(tài)。10是對(duì)照結(jié)果。11是狀態(tài)轉(zhuǎn)變,是當(dāng)前狀態(tài)13、輸入字符14、下一個(gè)狀態(tài)15的組。12是輸出描述,是當(dāng)前狀態(tài)13和條件編號(hào)16的組。13是當(dāng)前狀態(tài),14是輸入字符。15是下一個(gè)狀態(tài)。16是條件編號(hào)。
圖2是表示本發(fā)明中的對(duì)照條件2的結(jié)構(gòu)的圖。在圖中,條件式17是構(gòu)成對(duì)照條件2的單獨(dú)條件,在對(duì)照條件2中包含1個(gè)或多個(gè)條件式17。
圖3是表示本發(fā)明中的條件式17的結(jié)構(gòu)的圖。條件式17由條件編號(hào)6和條件描述18構(gòu)成,條件編號(hào)6是用于唯一區(qū)別條件式的編號(hào),條件描述18是用正規(guī)表達(dá)描述的對(duì)照條件。
圖4是表示本發(fā)明中的狀態(tài)轉(zhuǎn)變表生成部3的結(jié)構(gòu)的圖。在圖中,狀態(tài)轉(zhuǎn)變表生成控制部21控制生成狀態(tài)轉(zhuǎn)變生成表的動(dòng)作過(guò)程。NFA狀態(tài)集合22、NFA狀態(tài)轉(zhuǎn)變集合23、NFA輸出描述集合24、狀態(tài)集合25、輸出轉(zhuǎn)變集合26、狀態(tài)描述集合27是狀態(tài)轉(zhuǎn)變表生成控制部21所參照的數(shù)據(jù)。
圖5是本發(fā)明中的狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4的結(jié)構(gòu)的一例的圖。在圖中,31是散列值計(jì)算部,根據(jù)當(dāng)前狀態(tài)13和輸入字符14計(jì)算散列值32。散列值32是由散列值計(jì)算部31計(jì)算出的散列值。狀態(tài)轉(zhuǎn)變散列指針33是存儲(chǔ)狀態(tài)轉(zhuǎn)變散列鏈34的多個(gè)指針的表。狀態(tài)轉(zhuǎn)變散列鏈34是指向狀態(tài)轉(zhuǎn)變散列鏈34的指針、當(dāng)前狀態(tài)13、輸入字符14、下一個(gè)狀態(tài)15的組。狀態(tài)轉(zhuǎn)變散列表35是由狀態(tài)轉(zhuǎn)變散列指針33和狀態(tài)轉(zhuǎn)變散列鏈34構(gòu)成的數(shù)據(jù)結(jié)構(gòu)。比較部36比較從外部輸入的當(dāng)前狀態(tài)13a和輸入字符14a的組、與存儲(chǔ)在狀態(tài)轉(zhuǎn)變散列表35中的當(dāng)前狀態(tài)13b和輸入字符14b,輸出下一個(gè)狀態(tài)15。
圖6是本發(fā)明中的輸出表存儲(chǔ)部5的結(jié)構(gòu)的圖。條件編號(hào)索引41存儲(chǔ)多個(gè)指向條件編號(hào)鏈的指針。條件編號(hào)鏈42是指向條件編號(hào)鏈42的指針和條件編號(hào)16的組。
圖7是表示本發(fā)明中的對(duì)照結(jié)果10的一例的圖。對(duì)照結(jié)果10中包含輸入文檔6的對(duì)照成功的條件編號(hào)16。
下面,在說(shuō)明本發(fā)明的動(dòng)作之前,說(shuō)明下面說(shuō)明中使用的用語(yǔ)及符號(hào)。
如非專(zhuān)利文獻(xiàn)1等的記載,目前已知的帶輸出的確定性有限自動(dòng)機(jī)由(Q,Σ,Δ,δ,λ,q0)的組給出。其中,Q是狀態(tài)集合。Σ是輸入字母,包含空字符ε。Δ是輸出字母,δ是轉(zhuǎn)變函數(shù)(Q×Σ→Q),λ是輸出函數(shù)(Q→Δ),q0是初始狀態(tài)。
本發(fā)明的SDFA自動(dòng)機(jī)8由(Qs,Σs,Δs,δs,λs,q0)的組給出。
這里,Qs是狀態(tài)集合25,相當(dāng)于現(xiàn)有的帶輸出的有限自動(dòng)機(jī)的狀態(tài)集合Q。
Δs是輸出字母,在本實(shí)施例中為條件編號(hào)16的集合的集合。
δs是由狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4實(shí)現(xiàn)的狀態(tài)轉(zhuǎn)變函數(shù),下面,將當(dāng)前狀態(tài)13為qs、輸入字符14為σs時(shí)下一個(gè)狀態(tài)15為qd表述為δs(qs,σs)=qd。
q0是初始狀態(tài),其含義與現(xiàn)有已知的帶輸出的確定性有限自動(dòng)機(jī)相同。
Σs是在現(xiàn)有的帶輸出的有限自動(dòng)機(jī)的輸入字母Σ中增加了任意字符σany、除外字符σother的擴(kuò)展輸入字母。即為Σs=Σ∪{σany,σother}。
另外,當(dāng)δs(qs,σs)=qd時(shí),設(shè)狀態(tài)轉(zhuǎn)變11為t,表述為t=trans(qs,qd,σs)。
將針對(duì)當(dāng)前狀態(tài)13和輸入字符14的組存在下一個(gè)狀態(tài)15的狀態(tài)轉(zhuǎn)變11的集合稱(chēng)為狀態(tài)轉(zhuǎn)變集合26,表述為T(mén)。另外,對(duì)于狀態(tài)轉(zhuǎn)變t=trans(qs,qd,σs),將qs稱(chēng)為起點(diǎn)、qd稱(chēng)為終點(diǎn)、σs為轉(zhuǎn)變字符。并且,將提供狀態(tài)轉(zhuǎn)變t的起點(diǎn)的函數(shù)稱(chēng)為Source,提供終點(diǎn)的函數(shù)稱(chēng)為Destination,提供轉(zhuǎn)變字符的函數(shù)稱(chēng)為Char,分別表述為qs=Source(t)qd=Destination(t)σs=Char(t)。
另外,當(dāng)λs(qs)=r時(shí),設(shè)輸出描述18為d,表述為d=desc(qs,r)。
將針對(duì)當(dāng)前狀態(tài)13輸出字母r不是空的輸出描述12的集合稱(chēng)為輸出描述集合27,表述為D。對(duì)于輸出描述d=desc(qs,r),將qs稱(chēng)為輸出狀態(tài),r為輸出結(jié)果。并且,將提供輸出描述d的輸出狀態(tài)的函數(shù)稱(chēng)為State,提供輸出結(jié)果的函數(shù)稱(chēng)為Result,分別表述為qs=State(d)r=Result(d)。
在本發(fā)明的生成SDFA自動(dòng)機(jī)8的過(guò)程中生成NFA,但NFA由(Q(NFA),Σs,Δs,δs(NFA),λs(NFA),q0(NFA))的組表示。
這里,Q(NFA)表示NFA狀態(tài)集合22。狀態(tài)集合25成為NFA狀態(tài)的集合的集合。即,在將狀態(tài)集合25表述為Q時(shí),存在Q=2Q(NFA)的關(guān)系。下面,為了將NFA的狀態(tài)與DFA的狀態(tài)相區(qū)別,表述為q(NFA),將NFA的初始狀態(tài)表述為q0(NFA)。
δs(NFA)是NFA的狀態(tài)轉(zhuǎn)變函數(shù),是從當(dāng)前的NFA狀態(tài)13為q(NFA)、輸入字符14為σs起至下一個(gè)狀態(tài)的集合的函數(shù)。
λs(NFA)是NFA的輸出函數(shù),將當(dāng)前的NFA狀態(tài)13為q(NFA)時(shí)輸出字母成為r∈Δs表述為λs(NFA)(q(NFA))=r。
Δs是條件編號(hào)16的集合,Σs是擴(kuò)展輸入字母,其含義與本發(fā)明的SDFA自動(dòng)機(jī)8相同。
對(duì)于NFA的狀態(tài),如下所示規(guī)定NFA狀態(tài)轉(zhuǎn)變。在NFA的狀態(tài)qd(NFA)為qd(NFA)∈δ(qs(NFA),σs)時(shí),將NFA狀態(tài)轉(zhuǎn)變32表述為t(NFA)=trans(qs(NFA),qd(NFA),σs)。
將NFA狀態(tài)轉(zhuǎn)變的集合稱(chēng)為NFA狀態(tài)轉(zhuǎn)變集合,表述為T(mén)(NFA)。另外,同樣地,對(duì)于狀態(tài)轉(zhuǎn)變t(NFA)=trans(qs(NFA),qd(NFA),σs),將qs(NFA)稱(chēng)為起點(diǎn),qd(NFA)稱(chēng)為終點(diǎn),σs稱(chēng)為轉(zhuǎn)變字符。并且,將提供狀態(tài)轉(zhuǎn)變t(NFA)的起點(diǎn)的函數(shù)稱(chēng)為Source,提供終點(diǎn)的函數(shù)稱(chēng)為Destination,提供轉(zhuǎn)變字符的函數(shù)稱(chēng)為Char,分別表述為
qs(NFA)=Source(t(NFA))qd(NFA)=Destination(t(NFA))σs(NFA)=Char(t(NFA))。
將NFA狀態(tài)q(NFA)和輸出字母r的組稱(chēng)為NFA輸出描述。
在λs(q(NFA))=r時(shí),設(shè)NFA輸出描述34為d(NFA),則表述為d(NFA)=dese(qs(NFA),r)。
將針對(duì)NFA狀態(tài)13輸出字母p不是空的NFA輸出描述的集合稱(chēng)為NFA輸出描述集合24,表述為D(NFA)。對(duì)于輸出描述d(NFA)=dese(q(NFA),r),將q(NFA)稱(chēng)為輸出狀態(tài),r稱(chēng)為輸出結(jié)果。并且,將提供輸出描述d的輸出狀態(tài)的函數(shù)稱(chēng)為State,提供輸出結(jié)果的函數(shù)稱(chēng)為Result,分別表述為q(NFA)=State(d(NFA))r(NFA)=Result(d(NFA))。
通過(guò)上述,結(jié)束用語(yǔ)及符號(hào)的說(shuō)明,下面說(shuō)明動(dòng)作。
圖8表示本發(fā)明的字符串對(duì)照裝置1的動(dòng)作。
本發(fā)明的字符串對(duì)照裝置1首先獲取對(duì)照條件2,執(zhí)行利用狀態(tài)轉(zhuǎn)變表生成部3生成狀態(tài)轉(zhuǎn)變11和輸出描述12的過(guò)程、即編譯對(duì)照條件的流程(步驟S51)。
接著,獲取輸入文檔6,利用輸入字符讀取部7及SDFA自動(dòng)機(jī)8,依次執(zhí)行一邊參照狀態(tài)轉(zhuǎn)變11和輸出描述12、一邊輸出對(duì)照結(jié)果10的流程(步驟S52)。
在本實(shí)施例中,對(duì)于1次“編譯對(duì)照條件”執(zhí)行1次“對(duì)照輸入文檔”,但也可以利用在1次“編譯對(duì)照條件”的流程中生成的狀態(tài)轉(zhuǎn)變11和輸出描述12,對(duì)多個(gè)輸入文檔執(zhí)行“對(duì)照輸入文檔”。
下面,利用圖9說(shuō)明流程“編譯對(duì)照條件”。
首先,通過(guò)“生成包含ε轉(zhuǎn)變的NFA”的流程,根據(jù)正規(guī)表達(dá),生成包含ε轉(zhuǎn)變的NFA(步驟S101)。
接著,通過(guò)“除去ε轉(zhuǎn)變”的流程,除去包含在NFA中的ε轉(zhuǎn)變(基于空字符的轉(zhuǎn)變)(步驟S102)。
接著,通過(guò)“追加向初始狀態(tài)的轉(zhuǎn)變”的流程,追加對(duì)照失敗時(shí)向初始狀態(tài)的轉(zhuǎn)變(步驟S103)。
接著,通過(guò)“除去非確定性轉(zhuǎn)變”的流程,除去非確定性的轉(zhuǎn)變(步驟S104)。
接著,通過(guò)“除去未使用狀態(tài)”的流程,除去在此前的過(guò)程中不需要的狀態(tài)(步驟S105)。
接著,通過(guò)“削減狀態(tài)數(shù)”的流程,除去冗余狀態(tài)及冗余的狀態(tài)轉(zhuǎn)變(步驟S106)。
接著,通過(guò)“生成狀態(tài)轉(zhuǎn)變表和輸出表”的流程,根據(jù)狀態(tài)集合,生成狀態(tài)轉(zhuǎn)變表和輸出表(步驟S107)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“編譯對(duì)照條件”。
對(duì)于步驟S101的、“生成包含ε轉(zhuǎn)變的NFA”的流程,可以使用非專(zhuān)利文獻(xiàn)1等中示出的公知的流程。
但是,如圖24所示,將包含在正規(guī)表達(dá)中的、表示任意字符的元字符“.”置換成σany。下面,在圖24~圖31中,將狀態(tài)q(NFA)簡(jiǎn)單表述為q。
另外,如圖25所示,將包含在正規(guī)表達(dá)中的、表示特定字符集合以外的元字符“^”置換成σother,并且追加了追加從該狀態(tài)向初始狀態(tài)q0(NFA)的狀態(tài)轉(zhuǎn)變這一流程。
對(duì)于步驟S102的“除去ε轉(zhuǎn)變”的流程,可以利用非專(zhuān)利文獻(xiàn)1等中示出的眾所周知的流程,通過(guò)用向轉(zhuǎn)變目標(biāo)集合的轉(zhuǎn)變置換ε轉(zhuǎn)變(基于空字符的轉(zhuǎn)變)來(lái)實(shí)現(xiàn)。
下面,利用圖10示出步驟103的“追加向初始狀態(tài)的失敗轉(zhuǎn)變”的流程。
首先,在從由步驟S102生成的NFA的初始狀態(tài)q0(NFA)起不存在基于σany的轉(zhuǎn)變的情況下,前進(jìn)到步驟S202。除此以外的情況下,前進(jìn)到步驟S203(步驟S201)。
執(zhí)行“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起不存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”的流程并結(jié)束(步驟S202)。
在步驟S201中從NFA的初始狀態(tài)q0(NFA)起存在基于σany的轉(zhuǎn)變的情況下,執(zhí)行“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”的流程并結(jié)束(步驟S203)。
在本實(shí)施例中,根據(jù)從NFA的初始狀態(tài)q0(NFA)起是否存在基于σany的轉(zhuǎn)變目標(biāo)來(lái)分開(kāi)處理,但步驟S202的處理也可由步驟S203代行。步驟S202的處理與步驟S203相比,可適用的范圍限定在“從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)”的情況,但可以進(jìn)一步削減狀態(tài)轉(zhuǎn)變的數(shù)量。所謂從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo),是指在成為對(duì)照條件的正規(guī)表達(dá)的開(kāi)頭指定了任意字符“.”,但由于在實(shí)用中很少進(jìn)行這種指定,所以多數(shù)情況下可通過(guò)應(yīng)用步驟S202的處理來(lái)削減狀態(tài)轉(zhuǎn)變的數(shù)量。
通過(guò)以上過(guò)程,可執(zhí)行流程“追加向初始狀態(tài)的失敗轉(zhuǎn)變”。
下面,說(shuō)明步驟S202的“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起不存在基于σany的轉(zhuǎn)變目標(biāo)的情況”的流程。
通常,在執(zhí)行連續(xù)的字符串對(duì)照的NFA或DFA中,通過(guò)追加從所有狀態(tài)向初始狀態(tài)的ε轉(zhuǎn)變,可以實(shí)現(xiàn)從任意字符位置起的字符串對(duì)照。圖26中示出向?qū)?yīng)于正規(guī)表達(dá)(a|b|c(d|e))f的NFA中追加了ε轉(zhuǎn)變的例子。在本發(fā)明的SDFA自動(dòng)機(jī)8中,由于在轉(zhuǎn)變失敗時(shí)不再繼續(xù)讀入輸入字符而是返回初始狀態(tài)q0再次執(zhí)行狀態(tài)轉(zhuǎn)變,所以可省略向初始狀態(tài)q0的ε轉(zhuǎn)變。即,只要構(gòu)成圖27中示出的NFA即可,可大幅度地削減狀態(tài)轉(zhuǎn)變的總數(shù)。但是,在從初始狀態(tài)q0(NFA)起基于轉(zhuǎn)變字符σ可轉(zhuǎn)變成狀態(tài)q1(NFA)時(shí),在存在從狀態(tài)q(NFA)起的基于轉(zhuǎn)變字符σ的轉(zhuǎn)變、或者以狀態(tài)q(NFA)為起點(diǎn)的任意的轉(zhuǎn)變字符σ是σany的情況下,由于基于σ的轉(zhuǎn)變成功時(shí),也可能基于σ而轉(zhuǎn)變成q1(NFA),所以追加基于σ的、從狀態(tài)q(NFA)向狀態(tài)q1(NFA)的狀態(tài)轉(zhuǎn)變。圖28中示出正規(guī)表達(dá)(a|b|c(d|e))f的情況下的例子。在圖28的例子中,從初始狀態(tài)q0(NFA)基于轉(zhuǎn)變字符a可轉(zhuǎn)變成狀態(tài)q1(NFA),由于從狀態(tài)q3(NFA)起存在基于轉(zhuǎn)變字符a的轉(zhuǎn)變,所以如圖29所示,追加基于轉(zhuǎn)變字符a的、從狀態(tài)q3(NFA)向狀態(tài)q1(NFA)的轉(zhuǎn)變。從狀態(tài)q3(NFA)起基于轉(zhuǎn)變字符a的轉(zhuǎn)變?yōu)榉谴_定性的狀態(tài)轉(zhuǎn)變,但通過(guò)后續(xù)的“除去非確定性轉(zhuǎn)變”的流程,最終除去該非確定性轉(zhuǎn)變。流程“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起不存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”及“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”用于執(zhí)行該處理。
利用圖11說(shuō)明步驟S202的“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起不存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”的流程。
首先,設(shè)t0(NFA)為以步驟S102生成的NFA的初始狀態(tài)q0(NFA)為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S302(步驟S301)。
若結(jié)束了以NFA的初始狀態(tài)q0(NFA)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t0(NFA)的處理,則結(jié)束流程。除此以外的情況下前進(jìn)到步驟S303(步驟S302)。
設(shè)σ為Char(t0(NFA)),前進(jìn)到步驟S304(步驟S303)。
設(shè)q(NFA)為包含在NFA狀態(tài)集合Q(NFA)中的最初的NFA狀態(tài),前進(jìn)到步驟S305(步驟S304)。
若結(jié)束了包含在NFA狀態(tài)集合Q(NFA)中的所有NFA狀態(tài)q(NFA)的處理,則前進(jìn)到步驟S313。除此以外的情況下前進(jìn)到步驟S306(步驟S305)。
在NFA狀態(tài)q(NFA)為初始狀態(tài)q0(NFA)時(shí),前進(jìn)到步驟S312。除此以外的情況下前進(jìn)到步驟S307(步驟S306)。
設(shè)t(NFA)為以q(NFA)為起點(diǎn)的最初的NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S308(步驟S307)。
若結(jié)束了以q(NFA)為起點(diǎn)的所有NFA狀態(tài)轉(zhuǎn)變t(NFA)的處理,則前進(jìn)到步驟S312。除此以外的情況下前進(jìn)到步驟S309(步驟S308)。
在Char(t(NFA))=σ、Char(t(NFA))=σany中的任意一個(gè)條件成立時(shí),前進(jìn)到步驟S310。在任一條件都不成立時(shí),前進(jìn)到步驟S311(步驟S309)。
如果NFA狀態(tài)轉(zhuǎn)變trans(q(NFA),Destination(t0(NFA)),σ)未包含在NFA狀態(tài)轉(zhuǎn)變集合T(NFA)中,則加入T中,前進(jìn)到步驟S311(步驟S310)。
設(shè)t(NFA)為以NFA狀態(tài)q(NFA)為起點(diǎn)的下一個(gè)NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S305(步驟S311)。
在步驟S306中NFA狀態(tài)q(NFA)是NFA的初始狀態(tài)q0(NFA)的情況下,或者在步驟S308中處理了以q(NFA)為起點(diǎn)的所有NFA狀態(tài)轉(zhuǎn)變t(NFA)的情況下,設(shè)NFA狀態(tài)q(NFA)為包含在NFA狀態(tài)集合QNFA中的下一個(gè)NFA狀態(tài),前進(jìn)到步驟S305(步驟S312)。
在步驟S305中結(jié)束了所有NFA狀態(tài)q(NFA)的處理時(shí),設(shè)t0(NFA)為以NFA的初始狀態(tài)q0(NFA)為起點(diǎn)的下一個(gè)NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S302(步驟S313)。
通過(guò)以上過(guò)程,可執(zhí)行流程“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起不存在基于σany的轉(zhuǎn)變目標(biāo)的情況”)。
下面,說(shuō)明步驟S203的“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”的流程。該流程的目的與步驟S202相同,但如圖30示出的正規(guī)表達(dá)(.|b|c(d|e))f那樣,在從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)q1(NFA)的情況下,對(duì)于所有狀態(tài),在轉(zhuǎn)變成功時(shí)也可轉(zhuǎn)變成q1(NFA),所以如圖31所示,針對(duì)除去NFA的初始狀態(tài)q0(NFA)以外的所有NFA狀態(tài)q(NFA)和所有轉(zhuǎn)變字符σ,追加向q1(NFA)的轉(zhuǎn)變。
通過(guò)圖12說(shuō)明步驟S203的“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”的流程。
首先,設(shè)t0(NFA)為以步驟S102生成的NFA的初始狀態(tài)q0(NFA)為起點(diǎn)的最初的NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S352(步驟S351)。
若結(jié)束了以NFA的初始狀態(tài)q0(NFA)為起點(diǎn)的所有NFA狀態(tài)轉(zhuǎn)變t0(NFA)的處理,則結(jié)束流程。除此以外的情況下前進(jìn)到步驟S353(步驟S352)。
設(shè)σ為Char(t0(NFA)),前進(jìn)到步驟S354(步驟S353)。
設(shè)q為包含在NFA狀態(tài)集合Q(NFA)中的最初的NFA狀態(tài),前進(jìn)到步驟S355(步驟S354)。
若結(jié)束了包含在NFA狀態(tài)集合Q(NFA)中的所有NFA狀態(tài)q的處理,則前進(jìn)到步驟S359。除此以外的情況下前進(jìn)到步驟S356(步驟S355)。
在NFA狀態(tài)q(NFA)為初始狀態(tài)q0(NFA)的情況下,前進(jìn)到步驟S356。除此以外的情況下前進(jìn)到步驟S357(步驟S306)。
如果NFA狀態(tài)轉(zhuǎn)變trans(q(NFA),Destination(t0(NFA)),σ)未包含在NFA狀態(tài)轉(zhuǎn)變集合T(NFA)中,則加入到T(NFA)中,前進(jìn)到步驟S355(步驟S358)。
在步驟S355中結(jié)束了所有NFA狀態(tài)q(NFA)的處理時(shí),設(shè)t0(NFA)為以NFA的初始狀態(tài)q0(NFA)為起點(diǎn)的下一個(gè)NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S352(步驟S359)。
通過(guò)以上過(guò)程,可執(zhí)行流程“追加向初始狀態(tài)的失敗轉(zhuǎn)變(從初始狀態(tài)起存在基于σany的轉(zhuǎn)變目標(biāo)的情況)”。
下面,說(shuō)明步驟S104的“除去非確定性轉(zhuǎn)變”的流程。本流程除去包含在NFA中的非確定性轉(zhuǎn)變,生成確定性轉(zhuǎn)變。圖32中示出一例。由于從狀態(tài)qsource起作為基于轉(zhuǎn)變字符a的狀態(tài)轉(zhuǎn)變存在q1及q2,即為非確定性的,所以合并轉(zhuǎn)變目標(biāo)的狀態(tài),即如圖33所示,成為向作為轉(zhuǎn)變目標(biāo)的NFA狀態(tài)集合q1及q2的和集合qn=q1∪q2的狀態(tài)轉(zhuǎn)變。該流程基本上與非專(zhuān)利文獻(xiàn)1等中示出的DFA的生成流程相同,但在本實(shí)施例中,還如圖34那樣,對(duì)于包含基于任意字符σany的狀態(tài)轉(zhuǎn)變q2和基于轉(zhuǎn)變字符a的狀態(tài)轉(zhuǎn)變的終點(diǎn)q1的情況,除了非確定性的、向與轉(zhuǎn)變字符a有關(guān)的狀態(tài)qn=q1∪q2的狀態(tài)轉(zhuǎn)變之外,還生成向基于除外字符σother的狀態(tài)q1的轉(zhuǎn)變(圖35)。
利用圖13說(shuō)明步驟S104的“除去非確定性轉(zhuǎn)變”的流程。在本流程以及“除去與σother有關(guān)的非確定性轉(zhuǎn)變”的流程中使用變量Retry。變量Retry可以取TRUE(真)或FALSE(假)中的某一個(gè)值。
首先,執(zhí)行“進(jìn)行狀態(tài)集合的初始化”的步驟,前進(jìn)到步驟S402(步驟S401)。
接著,將變量Retry初始化成FALSE,前進(jìn)到S401(步驟S402)。
接著,執(zhí)行“除去與Σ有關(guān)的非確定性轉(zhuǎn)變”的步驟,前進(jìn)到步驟S404(步驟S403)。
接著,執(zhí)行“除去與σother有關(guān)的非確定性轉(zhuǎn)變”的步驟,前進(jìn)到步驟S405(步驟S404)。
在變量Retry為T(mén)RUE時(shí)前進(jìn)到步驟S403。為FALSE時(shí)結(jié)束(步驟S405)。
通過(guò)以上過(guò)程,可執(zhí)行流程“除去非確定性轉(zhuǎn)變”。
下面,說(shuō)明步驟S401的“進(jìn)行狀態(tài)集合的初始化”的流程。本流程用于為了生成DFA狀態(tài)而初始化必需的狀態(tài)集合,其目的在于對(duì)于所有的NFA狀態(tài)q(NFA),與相關(guān)聯(lián)的狀態(tài)轉(zhuǎn)變一起生成DFA的狀態(tài){q(NFA)}。
利用圖14說(shuō)明步驟S401的“進(jìn)行狀態(tài)集合的初始化”的流程。
首先,將狀態(tài)集合Q初始化為空,前進(jìn)到步驟S502(步驟S501)。
接著,設(shè)q(NFA)為包含在NFA狀態(tài)集合Q(NFA)中的最初的NFA狀態(tài),前進(jìn)到步驟S502(步驟S502)。
在處理了包含在NFA狀態(tài)集合Q(NFA)中的所有NFA狀態(tài)q(NFA)的情況下,前進(jìn)到步驟S506。除此以外的情況下前進(jìn)到步驟S504(步驟S503)。
在狀態(tài)集合Q中加入NFA狀態(tài)集合(即DFA的狀態(tài)){q(NFA)},前進(jìn)到步驟S505(步驟S504)。
設(shè)q(NFA)為包含在NFA狀態(tài)集合Q(NFA)中的下一個(gè)NFA狀態(tài),前進(jìn)到步驟S503(步驟S505)。
在步驟S503中處理了包含在NFA狀態(tài)集合Q(NFA)中的所有NFA狀態(tài)(NFA)時(shí),使?fàn)顟B(tài)轉(zhuǎn)變集合T為空,前進(jìn)到步驟S507(步驟S506)。
接著,設(shè)t(NFA)為包含在NFA狀態(tài)轉(zhuǎn)變集合T(NFA)中的最初的NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S508(步驟S507)。
若處理了包含在NFA狀態(tài)轉(zhuǎn)變集合T(NFA)中的所有NFA狀態(tài)轉(zhuǎn)變t(NFA),則前進(jìn)到步驟S511。除此以外的情況下前進(jìn)到步驟S509(步驟S508)。
在狀態(tài)轉(zhuǎn)變集合T中加入trans({Source(t(NFA))},{Destination(t(NFA))},Char(t(NFA))),前進(jìn)到步驟S510(步驟S509)。
設(shè)t(NFA)為包含在NFA狀態(tài)轉(zhuǎn)變集合T(NFA)中的下一個(gè)NFA狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S508(步驟S510)。
在步驟S508中處理了包含在T(NFA)中的所有NFA狀態(tài)轉(zhuǎn)變t(NFA)的情況下,使輸出描述集合D為空,前進(jìn)到步驟S512(步驟S511)。
接著,設(shè)d(NFA)為包含在NFA輸出描述集合D(NFA)中的最初的NFA輸出描述,前進(jìn)到步驟S508(步驟S512)。
若處理了包含在NFA輸出描述集合D(NFA)中的所有NFA輸出描述d(NFA),則結(jié)束。除此以外的情況下前進(jìn)到步驟S509(步驟S513)。
在輸出描述集合D中加入desc({State(d(NFA))},Result(d(NFA))),前進(jìn)到步驟S510(步驟S514)。
設(shè)d(NFA)為包含在NFA輸出描述集合D(NFA)中的下一個(gè)NFA輸出描述,前進(jìn)到步驟S508(步驟S515)。
通過(guò)以上過(guò)程,可執(zhí)行流程“進(jìn)行狀態(tài)集合的初始化”。
下面,說(shuō)明步驟S403的“除去與Σ有關(guān)的非確定性轉(zhuǎn)變”的流程。本流程的目的在于,如圖32及圖34示出的例子,在對(duì)于一個(gè)轉(zhuǎn)變字符σ∈Σ存在多個(gè)轉(zhuǎn)變目標(biāo)時(shí),通過(guò)用向新?tīng)顟B(tài)的轉(zhuǎn)變來(lái)置換,唯一地確定基于各轉(zhuǎn)變字符σ的轉(zhuǎn)變目標(biāo)。
利用圖15說(shuō)明步驟S403的“除去與Σ有關(guān)的非確定性轉(zhuǎn)變”的流程。在本流程中使用變量Found。變量Retry可以取TRUE或FALSE中的某一值。
首先,將Found初始化成FALSE,前進(jìn)到步驟S602(步驟S601)。
接著,設(shè)q為狀態(tài)集合Q中的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S603(步驟S602)。
在處理了狀態(tài)集合Q中的所有狀態(tài)q時(shí),前進(jìn)到步驟S616。除此以外的情況下前進(jìn)到步驟S604(步驟S603)。
設(shè)σ為輸入字母Σ中的最初的字母,前進(jìn)到步驟S605(步驟S604)。
在處理了輸入字母Σ中的所有字母σ時(shí),前進(jìn)到步驟S610。除此以外的情況下前進(jìn)到步驟S606(步驟S605)。
以q為起點(diǎn),存在多個(gè)以σ為轉(zhuǎn)變字符的狀態(tài)轉(zhuǎn)變t,或者存在以σ為轉(zhuǎn)變字符的狀態(tài)轉(zhuǎn)變t和以σany為轉(zhuǎn)變字符的狀態(tài)轉(zhuǎn)變t、即基于σ的轉(zhuǎn)變是非確定性的情況下,前進(jìn)到步驟S607。除此以外的情況下前進(jìn)到步驟S609(步驟S606)。
將參量qsource設(shè)定為q、σt設(shè)定為σ,執(zhí)行流程“生成新?tīng)顟B(tài)”,前進(jìn)到步驟S608(步驟S607)。
在變量Found中設(shè)定TRUE,前進(jìn)到步驟S609(步驟S608)。
設(shè)σ為輸入字母Σ中的下一個(gè)字母,前進(jìn)到步驟S605(步驟S609)。
在步驟S605中處理了輸入字母Σ中的所有字母σ時(shí),設(shè)t為以狀態(tài)q為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S611(步驟S610)。
在處理了以狀態(tài)q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),前進(jìn)到步驟S615。除此以外的情況下前進(jìn)到步驟S612(步驟S611)。
在t的轉(zhuǎn)變字符Char(t)為σany時(shí),前進(jìn)到步驟S613。除此以外的情況下前進(jìn)到步驟S614(步驟S612)。
以σother置換t的轉(zhuǎn)變字符、即以(Source(t),Destination(t),σother)置換t,前進(jìn)到步驟S614(步驟S613)。
設(shè)t為以狀態(tài)q為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S611(步驟S614)。
在步驟S611中處理了以狀態(tài)q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),設(shè)q為狀態(tài)集合Q中的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S603(步驟S615)。
在步驟S603中處理了狀態(tài)集合Q中的所有狀態(tài)q時(shí),若變量Found為T(mén)RUE,則前進(jìn)到步驟S601。除此以外的情況下結(jié)束(步驟S616)。
通過(guò)上面的過(guò)程,可執(zhí)行流程“除去與Σ有關(guān)的非確定性轉(zhuǎn)變”。
下面,說(shuō)明步驟S404的流程“除去與σother有關(guān)的非確定性轉(zhuǎn)變”。在本流程中,如圖36所示,對(duì)于通過(guò)“除去與Σ有關(guān)的非確定性轉(zhuǎn)變”生成的基于轉(zhuǎn)變字符σother的轉(zhuǎn)變,在從qsource起存在向多個(gè)狀態(tài)q1及q2的狀態(tài)轉(zhuǎn)變的情況下,通過(guò)用向它們的和集合qn=q1∪q2的狀態(tài)的轉(zhuǎn)變來(lái)置換,如圖37所示,除去基于轉(zhuǎn)變字符σother的非確定性轉(zhuǎn)變。
利用圖16說(shuō)明步驟S404的流程“除去與σother有關(guān)的非確定性轉(zhuǎn)變”。在本流程中使用變量Found。變量Found可以取TRUE或FALSE中的某一值。另外,在本流程中使用變量Counter。變量Counter可取0以上的整數(shù)值。
首先,在變量Found中設(shè)定FALSE,前進(jìn)到步驟S702(步驟S701)。
設(shè)q為狀態(tài)集合Q中的最初狀態(tài),前進(jìn)到步驟S703(步驟S702)。
在處理了狀態(tài)集合Q中的所有狀態(tài)q時(shí),前進(jìn)到步驟S714。除此以外的情況下前進(jìn)到步驟S701(步驟S703)。
向變量Counter設(shè)定0,前進(jìn)到步驟S705(步驟S704)。
向t設(shè)定以q為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S706(步驟S705)。
在處理了以q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),前進(jìn)到步驟S710。除此以外的情況下前進(jìn)到步驟S707(步驟S706)。
t的轉(zhuǎn)變字符Char(t)是σother時(shí)前進(jìn)到步驟S708。除此以外的情況下前進(jìn)到步驟S709(步驟S707)。
將變量Counter加1,前進(jìn)到步驟S709(步驟S708)。
向t設(shè)定以q為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S705(步驟S709)。
在步驟S706中處理了以q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),若變量Counter的值是2以上,則前進(jìn)到步驟S711。除此以外的情況下前進(jìn)到步驟S713(步驟S710)。
設(shè)定參數(shù)qsource為q、σt為σother,調(diào)用流程“生成新?tīng)顟B(tài)”,前進(jìn)到步驟S712(步驟S711)。
向變量Found設(shè)定TRUE,向變量Retry設(shè)定TRUE,前進(jìn)到步驟S713(步驟S712)。
設(shè)q為狀態(tài)集合Q中的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S703(步驟S713)。
在步驟S703中處理了狀態(tài)集合Q中的所有狀態(tài)q時(shí),變量Found是TRUE的情況下,前進(jìn)到步驟S701。除此以外的情況下結(jié)束(步驟S714)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“除去與σother有關(guān)的非確定性轉(zhuǎn)變”。
下面,說(shuō)明步驟S607及步驟S711的流程“生成新?tīng)顟B(tài)”的過(guò)程。本流程是從狀態(tài)qsource中除去與轉(zhuǎn)變字符σt有關(guān)的各個(gè)非確定性狀態(tài)轉(zhuǎn)變的流程。
利用圖17說(shuō)明步驟S607及步驟S711的流程“生成新?tīng)顟B(tài)”的過(guò)程。在流程“生成新?tīng)顟B(tài)”中,設(shè)qsource及σt為參數(shù)。
首先,以狀態(tài)qsource為起點(diǎn),求出基于σl可轉(zhuǎn)變的狀態(tài)的集合,求出與這些NFA狀態(tài)有關(guān)的和集合,設(shè)為狀態(tài)qn。在狀態(tài)轉(zhuǎn)變集合T中包含qn時(shí),前進(jìn)到步驟S817。除此以外的情況下前進(jìn)到步驟S802(步驟S801)。
接著,向狀態(tài)集合Q追加狀態(tài)qn,前進(jìn)到步驟S803(步驟S802)。
設(shè)t為以qsource為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S804(步驟S803)。
在處理了以qsource為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),前進(jìn)到步驟S817。除此以外的情況下前進(jìn)到步驟S805(步驟S804)。
在Char(t)=σt時(shí)、或Char(t)=σany時(shí),前進(jìn)到步驟S806。除此以外的情況下前進(jìn)到步驟S816(步驟S805)。
設(shè)t1為以Destination(t)為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S807(步驟S806)。
在處理了以Destination(t)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t1時(shí),前進(jìn)到步驟S812。除此以外的情況下前進(jìn)到步驟S808(步驟S807)。
如果不是狀態(tài)轉(zhuǎn)變trans(qn,Destination(t1),Char(t1))∈T,則向T追加trans(qn,Destination(t1),Char(t1)),前進(jìn)到步驟S809(步驟S808)。
若Char(t1)=σother,則前進(jìn)到步驟S810。除此以外則前進(jìn)到步驟S811(步驟S809)。
調(diào)用流程“修正基于σother的狀態(tài)轉(zhuǎn)變”,前進(jìn)到步驟S811。這時(shí),提供(qsource,qn,t1)作為參數(shù)(步驟S810)。
設(shè)t1為以Destination(t)為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S807(步驟S811)。
在步驟S807中處理了以Destination(t)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t1時(shí),設(shè)d為以Destination(t)為輸出狀態(tài)的最初的輸出描述,前進(jìn)到步驟S813(步驟S812)。
在處理了以Destination(t)為輸出狀態(tài)的所有輸出描述d時(shí),前進(jìn)到步驟S816。除此以外的情況下前進(jìn)到步驟S814(步驟S813)。
如果不是輸出描述desc(qn,Result(d))∈D,則在D中加入desc(qn,Result(d)),前進(jìn)到步驟S815(步驟S814)。
設(shè)d為以Destination(t)為輸出狀態(tài)的下一個(gè)輸出描述,前進(jìn)到步驟S813(步驟S815)。
設(shè)t為以qsource為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S804(步驟S816)。
在步驟S801中qn未包含在狀態(tài)轉(zhuǎn)變集合T中的情況下、以及在步驟S804中處理了以qsource為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t的情況下,設(shè)t為以qsource為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S818(步驟S817)。
在處理了以qsource為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),前進(jìn)到步驟S822。除此以外的情況下前進(jìn)到步驟S819(步驟S818)。
在Char(t)=σt時(shí)前進(jìn)到步驟S820。除此以外的情況下前進(jìn)到步驟S821(步驟S819)。
從狀態(tài)轉(zhuǎn)變集合T中刪除狀態(tài)轉(zhuǎn)變t,前進(jìn)到步驟S821(步驟S820)。
設(shè)t為以qsource為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S818(步驟S821)。
在步驟S818中處理了以qsource為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),若不是狀態(tài)轉(zhuǎn)變trans(qsource,qn,σt)∈T,則向T中追加trans(qsource,qn,σt)并結(jié)束(步驟S822)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“生成新?tīng)顟B(tài)”。
下面,說(shuō)明步驟S811的流程“修正基于σother的狀態(tài)轉(zhuǎn)變”。本流程如圖38所示,示出在以除去非確定性轉(zhuǎn)變時(shí)應(yīng)合并的狀態(tài)q1、q2為起點(diǎn)的狀態(tài)轉(zhuǎn)變中包含基于轉(zhuǎn)變字符σother的狀態(tài)轉(zhuǎn)變時(shí)的、成為以狀態(tài)q1、q2為起點(diǎn)的狀態(tài)轉(zhuǎn)變的終點(diǎn)的狀態(tài)的合并過(guò)程。如果合并圖38的狀態(tài)q1、q2,則如圖39所示,基于狀態(tài)qn=q1∪q2和轉(zhuǎn)變字符b的狀態(tài)轉(zhuǎn)變的終點(diǎn)為q3∪q5。同樣地,如果合并圖40示出的狀態(tài)q1、q2,則如圖41所示,基于轉(zhuǎn)變字符b、c、σother的狀態(tài)轉(zhuǎn)變的終點(diǎn)分別為q3∪q6、q4∪q5、q4∪q6。
利用圖18說(shuō)明步驟S811的流程“修正σother的狀態(tài)轉(zhuǎn)變”。在本流程中,使用擴(kuò)展輸入字母σ∈Σs的集合CharSet。
首先,將CharSet初始化為空,前進(jìn)到步驟S902(步驟S901)。
接著,設(shè)t為以Source(tother)為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S903(步驟S902)。
在處理了以Source(tother)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變時(shí),前進(jìn)到步驟S907。除此以外的情況下前進(jìn)到步驟S904(步驟S903)。
在Char(t)包含在輸入字母Σ中、即Char(t)≠σany且Char(t)≠σother時(shí),前進(jìn)到步驟S906。除此以外的情況下前進(jìn)到步驟S905(步驟S904)。
在CharSet中加入Char(t),前進(jìn)到步驟S906(步驟S905)。
設(shè)t為以Source(tother)為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S903(步驟S906)。
在步驟S903中處理了以Source(tother)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變時(shí),設(shè)t為以狀態(tài)q為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S908(步驟S907)。
在處理了以狀態(tài)q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變q時(shí)結(jié)束。除此以外的情況下前進(jìn)到步驟S909(步驟S908)。
在Destination(t)≠Source(tother)時(shí)前進(jìn)到步驟S910。除此以外的情況下前進(jìn)到步驟S916(步驟S909)。
設(shè)t1為以Destination(t)為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S911(步驟S910)。
在處理了以Destination(t)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t1時(shí)前進(jìn)到步驟S916。除此以外的情況下前進(jìn)到步驟S912(步驟S911)。
在Char(t1)包含在輸入字母Σ中、即Char(t1)≠σany且Char(t1)≠σother時(shí)前進(jìn)到步驟S913。除此以外的情況下前進(jìn)到步驟S915(步驟S912)。
在Char(t1)包含在CharSet中時(shí)前進(jìn)到步驟S915。除此以外的情況下前進(jìn)到步驟S914(步驟S913)。
如果不是狀態(tài)轉(zhuǎn)變trans(qn,Destination(tother),Char(t1))∈T,則在T中加入trans(qn,Destination(tother),Char(t1)),前進(jìn)到步驟S915(步驟S914)。
設(shè)t1為以Destination(t)為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S911(步驟S915)。
在步驟S909中不是Destination(t)≠Source(tother)的情況下,或在步驟S911中處理了以Destination(t)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t1的情況下,設(shè)t為以狀態(tài)q為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S908(步驟S916)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“修正基于σother的狀態(tài)轉(zhuǎn)變”。
下面,說(shuō)明步驟S105的“除去未使用狀態(tài)”的流程。在本流程中,刪除此前的處理結(jié)果產(chǎn)生的、不成為狀態(tài)轉(zhuǎn)變終點(diǎn)的狀態(tài),即對(duì)任何輸入都決不會(huì)到達(dá)的狀態(tài)。
利用圖19說(shuō)明步驟S105的“除去未使用狀態(tài)”的流程。在本流程中使用變量Found。變量Found可以取TRUE或FALSE中的某一值。
首先,使變量Found為FALSE,前進(jìn)到步驟S1002(步驟S1001)。
接著,設(shè)q為包含在狀態(tài)集合Q中的最初狀態(tài),前進(jìn)到步驟S1003(步驟S1002)。
在處理了包含在狀態(tài)集合Q中的所有狀態(tài)q時(shí)前進(jìn)到步驟S1017。除此以外的情況下前進(jìn)到步驟S1004(步驟S1003)。
在q是初期狀態(tài)q0時(shí),前進(jìn)到步驟S1016。除此以外的情況下前進(jìn)到步驟S1005(步驟S1004)。
在存在以q為終點(diǎn)的狀態(tài)轉(zhuǎn)變時(shí),前進(jìn)到步驟S1016。除此以外的情況下前進(jìn)到步驟S1006(步驟S1005)。
使變量Found為T(mén)RUE,前進(jìn)到步驟S1007(步驟S1006)。
設(shè)t為以q為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1008(步驟S1007)。
在處理了以q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),前進(jìn)到步驟S1011。除此以外的情況下前進(jìn)到步驟S1009(步驟S1008)。
從狀態(tài)轉(zhuǎn)變集合T中去掉狀態(tài)轉(zhuǎn)變t,前進(jìn)到步驟S1010(步驟S1009)。
設(shè)t為以q為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1008(步驟S1010)。
在步驟S1008中處理了以q為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t時(shí),設(shè)d為以q為輸出狀態(tài)的最初的輸出描述,前進(jìn)到步驟S1012(步驟S1011)。
在處理了以q為輸出狀態(tài)的所有輸出描述d時(shí),前進(jìn)到步驟S1015。除此以外的情況下前進(jìn)到步驟S1013(步驟S1012)。
從輸出描述集合D中刪除輸出描述d,前進(jìn)到步驟S1014(步驟S1013)。
設(shè)d為以q為輸出狀態(tài)的下一個(gè)輸出描述,前進(jìn)到步驟S1012(步驟S1014)。
在步驟S1012中處理了以q為輸出狀態(tài)的所有輸出描述d時(shí),從狀態(tài)集合Q中刪除狀態(tài)q,前進(jìn)到步驟S1012(步驟S1015)。
設(shè)q為包含在狀態(tài)集合Q中的下一個(gè)狀態(tài),前進(jìn)到步驟S1003(步驟S1016)。
在步驟S1003中處理了包含在狀態(tài)集合Q中的所有狀態(tài)q的情況下,檢查變量Found,在Found為T(mén)RUE時(shí)前進(jìn)到步驟S1002。除此以外的情況下結(jié)束(步驟S1017)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“除去未使用狀態(tài)”。
流程“除去未使用狀態(tài)”的目的在于削減存儲(chǔ)狀態(tài)轉(zhuǎn)變表所需的存儲(chǔ)容量。所以,即使省略本流程也可以執(zhí)行流程“對(duì)照輸入文檔”,從而通過(guò)省略可縮短“編譯對(duì)照條件”所需的時(shí)間。
下面,利用圖20說(shuō)明步驟S106的“除去冗余狀態(tài)”的流程。在本流程中,除去2種不需要的狀態(tài)。第1種情況是具有與基于σother的狀態(tài)轉(zhuǎn)變相同的終點(diǎn)的狀態(tài)的狀態(tài)轉(zhuǎn)變。圖42中示出一例。在圖42中,即使刪除基于轉(zhuǎn)變字符b的、以q3為終點(diǎn)的狀態(tài)轉(zhuǎn)變,SDFA自動(dòng)機(jī)的動(dòng)作也相同,從而可以通過(guò)刪除該狀態(tài)轉(zhuǎn)變,削減狀態(tài)轉(zhuǎn)變的總數(shù),削減存儲(chǔ)狀態(tài)轉(zhuǎn)變表所需的存儲(chǔ)容量。第2種情況是針對(duì)所有轉(zhuǎn)變字符的狀態(tài)轉(zhuǎn)變的終點(diǎn)相等的多個(gè)狀態(tài)的合并。圖43中示出一例。在圖43中,在狀態(tài)q1和q2下針對(duì)所有轉(zhuǎn)變字符的狀態(tài)轉(zhuǎn)變的終點(diǎn)相等,所以可以用合并了狀態(tài)q1和狀態(tài)q2的qn=q1∪q2來(lái)置換。如果由于該2種情況中的一種刪除了狀態(tài)或狀態(tài)轉(zhuǎn)變,則由此可能會(huì)由于另一種情況而刪除狀態(tài)或狀態(tài)轉(zhuǎn)變,所以重復(fù)這2種情況直至不再刪除狀態(tài)或狀態(tài)轉(zhuǎn)變。
利用圖20說(shuō)明步驟S106的“除去冗余狀態(tài)”的流程。在本流程中使用變量StateRemoved及TransitionRemoved。變量StateRemoved及TransitionRemoved可以取TRUE或FALSE中的某一值。
首先,對(duì)StateRemoved設(shè)定TRUE,前進(jìn)到步驟S1102(步驟S1101)。
調(diào)用流程“刪除冗余的狀態(tài)轉(zhuǎn)變”,前進(jìn)到步驟S1103。在本流程中設(shè)定TransitionRemoved(步驟S1102)。
在TransitionRemoved=FALSE且StateRemoved=FALSE時(shí)結(jié)束。除此以外的情況下前進(jìn)到步驟S1104(步驟S1103)。
調(diào)用流程“合并冗余狀態(tài)”,前進(jìn)到步驟S1105(步驟S1104)。
在TransitionRemoved=FALSE且StateRemoved=FALSE時(shí)結(jié)束。除此以外的情況下前進(jìn)到步驟S1102(步驟S1105)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“除去冗余狀態(tài)”。
流程“除去冗余狀態(tài)”的目的在于削減存儲(chǔ)狀態(tài)轉(zhuǎn)變表所需的存儲(chǔ)容量。因此,即使省略本流程也可執(zhí)行流程“對(duì)照輸入文檔”,從而可以通過(guò)省略來(lái)縮短“編譯對(duì)照條件”所需的時(shí)間。
下面,說(shuō)明步驟S1102的流程“刪除冗余的狀態(tài)轉(zhuǎn)變”。本流程相當(dāng)于“除去冗余狀態(tài)”的第1種情況,刪除圖42所示的、具有與基于σother的狀態(tài)轉(zhuǎn)變相同的終點(diǎn)的狀態(tài)的狀態(tài)轉(zhuǎn)變。
利用圖21說(shuō)明步驟S1102的流程“刪除冗余的狀態(tài)轉(zhuǎn)變”。
首先,將變量TransitionRemoved設(shè)定成FALSE,前進(jìn)到步驟S1202(步驟S1201)。
接著,設(shè)t為包含在狀態(tài)轉(zhuǎn)變集合T中的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1203(步驟S1202)。
在處理了包含在狀態(tài)轉(zhuǎn)變集合T中的所有狀態(tài)t時(shí)結(jié)束。除此以外的情況下前進(jìn)到步驟S1204(步驟S1203)。
在Char(t)為σother時(shí),前進(jìn)到步驟S1205。除此以外的情況下前進(jìn)到步驟S1210(步驟S1204)。
接著,設(shè)t1為以Source(t)為起點(diǎn)的最初的狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1206(步驟S1205)。
在處理了以Source(t)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t1時(shí),前進(jìn)到步驟S1210。除此以外的情況下前進(jìn)到步驟S1207(步驟S1206)。
在t1≠t、且Destination(t1)=Destination(t)時(shí),前進(jìn)到步驟S1208。除此以外的情況下前進(jìn)到步驟S1209(步驟S1207)。
從狀態(tài)轉(zhuǎn)變集合T中刪除狀態(tài)轉(zhuǎn)變t1,前進(jìn)到步驟S1209(步驟S1208)。
設(shè)t1為以Source(t)為起點(diǎn)的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1206(步驟S1209)。
在步驟S1204中Char(t)不是σother的情況下,或者在步驟S1206中處理了以Source(t)為起點(diǎn)的所有狀態(tài)轉(zhuǎn)變t1的情況下,設(shè)t為包含在狀態(tài)轉(zhuǎn)變集合T中的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1203(步驟S1210)。
通過(guò)以上的過(guò)程,可執(zhí)行流程“刪除冗余的狀態(tài)轉(zhuǎn)變”。
下面,說(shuō)明步驟1104的流程“合并冗余狀態(tài)”。本流程合并“除去冗余狀態(tài)”的第2種情況、即如圖43所示的針對(duì)所有轉(zhuǎn)變字符的狀態(tài)轉(zhuǎn)變的終點(diǎn)相等的多個(gè)狀態(tài)。
步驟1104的流程“合并冗余狀態(tài)”例如可利用非專(zhuān)利文獻(xiàn)1等中記載的眾所周知的流程來(lái)執(zhí)行。通過(guò)該流程,在合并了1個(gè)以上的狀態(tài)時(shí)將變量StateRemoved設(shè)定成TRUE。除此以外的情況下將變量StateRemoved設(shè)定成FALSE。
下面,利用圖22說(shuō)明步驟S107的“生成狀態(tài)轉(zhuǎn)變表和輸出表”。在本流程中,從狀態(tài)集合25、狀態(tài)轉(zhuǎn)變集合26以及輸出描述集合27中取出狀態(tài)轉(zhuǎn)變11和輸出描述12,分別存儲(chǔ)在狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4、輸出表存儲(chǔ)部12中。
首先,當(dāng)設(shè)包含在狀態(tài)集合Q中的狀態(tài)總數(shù)為N時(shí),使0~N-1的唯一的狀態(tài)編號(hào)StateId(q)對(duì)應(yīng)于各狀態(tài)q(步驟S1301)。
從狀態(tài)轉(zhuǎn)變集合T中取出最初的狀態(tài)轉(zhuǎn)變t(步驟S1302)。
若處理了包含在狀態(tài)轉(zhuǎn)變集合T中的所有狀態(tài)轉(zhuǎn)變t,則前進(jìn)到步驟S1307。除此以外的情況下前進(jìn)到步驟S1304(步驟S1303)。
針對(duì)當(dāng)前狀態(tài)Source(t)、輸入字符Char(t)的組,通過(guò)散列值計(jì)算部31計(jì)算散列值32,前進(jìn)到步驟S1305(步驟S1304)。
向以散列值32作為偏移的狀態(tài)轉(zhuǎn)變散列指針33追加由當(dāng)前狀態(tài)Source(t)、輸入字符Char(t)、下一個(gè)狀態(tài)Destination(t)的組構(gòu)成的狀態(tài)轉(zhuǎn)變散列鏈34,前進(jìn)到步驟S1306(步驟S1305)。
設(shè)t為包含在狀態(tài)轉(zhuǎn)變集合T中的下一個(gè)狀態(tài)轉(zhuǎn)變,前進(jìn)到步驟S1303(步驟S1306)。
在步驟1303中處理了包含在狀態(tài)轉(zhuǎn)變集合T中的所有狀態(tài)轉(zhuǎn)變時(shí),從輸出描述集合中取出最初的輸出描述d(步驟S1307)。
若處理了包含在輸出描述集合D中的所有輸出描述d,則結(jié)束。除此以外的情況下前進(jìn)到步驟S130(步驟S1308)。
向?qū)?yīng)于State(d)的狀態(tài)編號(hào)StateId(state(d))的條件編號(hào)索引41追加Result(d)作為條件編號(hào)鏈42,前進(jìn)到步驟S1310(步驟S1309)。
設(shè)d為包含在輸出描述集合D中的下一個(gè)輸出描述,前進(jìn)到步驟S1308(步驟S1310)。
通過(guò)以上示出的過(guò)程,可執(zhí)行流程“生成狀態(tài)轉(zhuǎn)變表和輸出表”。
下面,利用圖23說(shuō)明流程“對(duì)照輸入文檔”首先,對(duì)狀態(tài)q設(shè)定初始狀態(tài)q0,前進(jìn)到步驟S2002(步驟S2001)。
搜索輸出表存儲(chǔ)部5,輸出與q關(guān)聯(lián)的條件編號(hào)16。該過(guò)程通過(guò)依次搜索指向?qū)?yīng)于條件編號(hào)索引41的當(dāng)前狀態(tài)13的狀態(tài)編號(hào)StateId(q)的條件編號(hào)鏈42的指針來(lái)實(shí)現(xiàn)。若所有的條件編號(hào)鏈42的搜索結(jié)束,則前進(jìn)到步驟S2003(步驟S2002)。
若輸入所有結(jié)束則結(jié)束。除此以外的情況下前進(jìn)到步驟S2004(步驟S2003)。
從輸入字符讀取部7獲取下一個(gè)輸入字符14,設(shè)為σ,前進(jìn)到步驟S2005(步驟S2004)。
搜索狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4,檢查從狀態(tài)q起是否存在基于轉(zhuǎn)變字符σ的轉(zhuǎn)變目標(biāo)qd,即是否存在trans(q,qd,σ)∈T的qd,前進(jìn)到步驟S2006(步驟S2005)。
在存在轉(zhuǎn)變目標(biāo)qd時(shí)前進(jìn)到步驟S2007。除此以外的情況下前進(jìn)到步驟S2008(步驟S2006)。
向q設(shè)定qd,前進(jìn)到步驟S2002(步驟S2007)。
在步驟S2006中不存在qd時(shí),檢查從狀態(tài)q起是否存在基于轉(zhuǎn)變字符σother的轉(zhuǎn)變目標(biāo)qd,即是否存在trans(q,qd,σother)∈T的qd,前進(jìn)到步驟S2009(步驟S2008)。
在存在轉(zhuǎn)變目標(biāo)qd時(shí)前進(jìn)到步驟S2007。除此以外的情況下前進(jìn)到步驟S2010(步驟S2009)。
向狀態(tài)q設(shè)定q0,前進(jìn)到步驟S2006。
通過(guò)以上的過(guò)程,可執(zhí)行流程“對(duì)照輸入文檔”。
下面,以圖44示出的對(duì)照條件2和圖54示出的輸入字符串的情況為例,說(shuō)明本實(shí)施例的字符串對(duì)照裝置的動(dòng)作。圖44的對(duì)照條件使專(zhuān)利文獻(xiàn)3中示出的圖52的對(duì)照條件的表述與本實(shí)施例的形式一致,是與圖52在邏輯上等價(jià)的對(duì)照條件。
通過(guò)執(zhí)行步驟S51示出的流程“編譯對(duì)照條件”,根據(jù)圖44的對(duì)照條件2,生成圖45中示出的狀態(tài)轉(zhuǎn)變表和圖46中示出的輸出表。另外,設(shè)初始狀態(tài)的狀態(tài)編號(hào)為0。
圖45的狀態(tài)轉(zhuǎn)變表用表來(lái)表現(xiàn)對(duì)應(yīng)于存儲(chǔ)在狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4中的當(dāng)前狀態(tài)13、輸入字符14的下一個(gè)狀態(tài)15,例如,在當(dāng)前狀態(tài)的狀態(tài)編號(hào)是6、輸入字符為“d”時(shí),示出下一個(gè)狀態(tài)為10。在圖中,“-”表示不存在下一個(gè)狀態(tài)15,對(duì)于這樣的組合,狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4可以不消耗存儲(chǔ)器地存儲(chǔ)?,F(xiàn)有的帶輸出的有限狀態(tài)自動(dòng)機(jī)如圖53所示,需要90個(gè)組合,而在圖45的例子中,只要存儲(chǔ)46個(gè)狀態(tài)轉(zhuǎn)變的信息即可,從而得到削減存儲(chǔ)狀態(tài)轉(zhuǎn)變表所需的存儲(chǔ)器的效果。
圖46的輸出表用表來(lái)表現(xiàn)對(duì)應(yīng)于存儲(chǔ)在輸出表存儲(chǔ)部5中的當(dāng)前狀態(tài)13的條件編號(hào)16的集合,例如,表示當(dāng)前狀態(tài)是4時(shí)輸出條件編號(hào)0。
作為一例,在圖47中示出以輸入字符串“aaca”為輸入時(shí)的動(dòng)作。首先,將狀態(tài)q設(shè)定成初始狀態(tài)(狀態(tài)0)。接著,讀第1個(gè)字符的字符“a”,轉(zhuǎn)變成作為在狀態(tài)0下字符“a”的轉(zhuǎn)變目標(biāo)的狀態(tài)2。由于定義了基于字符“a”的轉(zhuǎn)變目標(biāo),所以不需要參照σother,在圖47中表述為(不需)。接著,讀第2個(gè)字符的字符“a”,轉(zhuǎn)變成作為在狀態(tài)2下字符“a”的轉(zhuǎn)變目標(biāo)的狀態(tài)5。接著,讀第3個(gè)字符的字符“c”,轉(zhuǎn)變成作為在狀態(tài)5下字符“c”的轉(zhuǎn)變目標(biāo)的狀態(tài)9。接著,讀第4個(gè)字符的字符“a”,轉(zhuǎn)變成作為在狀態(tài)9下字符“a”的轉(zhuǎn)變目標(biāo)的狀態(tài)12。這里,結(jié)束輸入。
在專(zhuān)利文獻(xiàn)3中記載的現(xiàn)有技術(shù)中,對(duì)于同等的條件,必須參照7次狀態(tài)轉(zhuǎn)變表,但在本實(shí)施例中用4次完成。這樣,根據(jù)本發(fā)明,其目的在于使由于轉(zhuǎn)變失敗所導(dǎo)致的狀態(tài)轉(zhuǎn)變表的參照次數(shù)為每1個(gè)字符2次以下,防止由于重復(fù)轉(zhuǎn)變失敗所導(dǎo)致的性能降低,從而可執(zhí)行高速的字符串對(duì)照。
另外,圖44的對(duì)照條件是為了與專(zhuān)利文獻(xiàn)3中所述的技術(shù)相比較而記載的條件,具有從初始狀態(tài)起可實(shí)現(xiàn)基于所有字符的轉(zhuǎn)變這樣的特殊條件。圖44的對(duì)照條件的目的在于即使對(duì)照對(duì)象字符串“abcd”中的一個(gè)字符變化,也可檢測(cè)出該字符串,但可以在幾乎不變更其目的及對(duì)照條件的含義的情況下變換成圖48的對(duì)照條件。這種情況下,可進(jìn)一步削減狀態(tài)轉(zhuǎn)變所需的存儲(chǔ)器,從而進(jìn)一步發(fā)揮本實(shí)施例的效果。
通過(guò)執(zhí)行步驟S51中示出的流程“編譯對(duì)照條件”,根據(jù)圖48的對(duì)照條件2,生成圖49中示出的狀態(tài)轉(zhuǎn)變表和圖50中示出的輸出表。另外,設(shè)初始狀態(tài)的狀態(tài)編號(hào)為0。
圖49的狀態(tài)轉(zhuǎn)變表的含義與圖45相同,將必須在狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4中存儲(chǔ)的狀態(tài)轉(zhuǎn)變數(shù)削減至23個(gè),從而進(jìn)一步得到削減必需的存儲(chǔ)器的效果。
另外,對(duì)于圖48的對(duì)照條件2,在圖51中示出針對(duì)輸入“xabxd”的動(dòng)作。由于在狀態(tài)0中未定義第1個(gè)字符“x”的轉(zhuǎn)變目標(biāo),所以參照σother,但盡管如此,由于未定義轉(zhuǎn)變目標(biāo),所以將下一個(gè)狀態(tài)設(shè)為初始狀態(tài),即狀態(tài)0。這時(shí)參照了2次狀態(tài)轉(zhuǎn)變表。接著,基于第2個(gè)字符“a”轉(zhuǎn)變成狀態(tài)3,基于第3個(gè)字符“b”轉(zhuǎn)變成狀態(tài)6。在第4個(gè)字符“x”中由于未定義“x”的轉(zhuǎn)變目標(biāo),所以參照σother,得到下一個(gè)狀態(tài)1。這時(shí),參照了2次狀態(tài)轉(zhuǎn)變表。并且,基于第5個(gè)字符“d”轉(zhuǎn)變成狀態(tài)2。由于狀態(tài)2存在編號(hào)0作為成為輸出的條件編號(hào)16,所以將其輸出。這種情況下,狀態(tài)轉(zhuǎn)變表的參照次數(shù)為7次。
另外,如非專(zhuān)利文獻(xiàn)1等所述,不具有輸出的一般的DFA可視為輸出“已受理”、“不受理”這2種信息作為輸出字母的特殊的Moore機(jī)器。在本實(shí)施例中也可構(gòu)成通過(guò)簡(jiǎn)單判定對(duì)照結(jié)果中是否存在條件編號(hào)、來(lái)輸出“已受理”、“不受理”這2種信息的字符串對(duì)照裝置。
另外,在上述實(shí)施例中,輸入及對(duì)照的對(duì)象設(shè)為“字符”,但“字符”不限于人類(lèi)可讀的字符串,可適用于任意的記號(hào)串、數(shù)據(jù)串。例如,也可適用于識(shí)別基因排列或利用傳感器等測(cè)量出的數(shù)據(jù)。
另外,在上述實(shí)施例中,在狀態(tài)轉(zhuǎn)變表存儲(chǔ)部4中使用狀態(tài)轉(zhuǎn)變散列表35,但也可以由可以在邏輯上表現(xiàn)數(shù)組、樹(shù)結(jié)構(gòu)等2維結(jié)構(gòu)的表的任何數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
另外,對(duì)于初始狀態(tài)等使用頻率高的狀態(tài),使用訪(fǎng)問(wèn)速度高的數(shù)組等數(shù)據(jù)結(jié)構(gòu),對(duì)于使用頻率低的狀態(tài),可以同時(shí)使用存儲(chǔ)容量的效率高的散列表或樹(shù)結(jié)構(gòu)等數(shù)據(jù)結(jié)構(gòu)。
另外,在上述實(shí)施例中,在輸出表存儲(chǔ)部5中使用條件編號(hào)索引41,但也可以利用可以在邏輯上表現(xiàn)樹(shù)結(jié)構(gòu)或散列表等1維結(jié)構(gòu)表的任何數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
產(chǎn)業(yè)上的可利用性本發(fā)明可適用于字符串對(duì)照裝置。
權(quán)利要求
1.一種字符串對(duì)照裝置,其特征在于,具備狀態(tài)轉(zhuǎn)變表生成部,根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件,生成狀態(tài)轉(zhuǎn)變表;和自動(dòng)機(jī),根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變,其中,當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述自動(dòng)機(jī)不繼續(xù)讀入輸入字符,而是轉(zhuǎn)變到初始狀態(tài)。
2.根據(jù)權(quán)利要求1所述的字符串對(duì)照裝置,其特征在于在輸入了多個(gè)對(duì)照條件時(shí),所述狀態(tài)轉(zhuǎn)變表生成部根據(jù)狀態(tài)的合并來(lái)進(jìn)行輸出描述的合并,生成輸出表,所述自動(dòng)機(jī)根據(jù)所述輸出表進(jìn)行輸出。
3.根據(jù)權(quán)利要求1所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部在生成狀態(tài)轉(zhuǎn)變表時(shí),當(dāng)基于規(guī)定的轉(zhuǎn)變字符σ可以從初始狀態(tài)q0轉(zhuǎn)變成規(guī)定的狀態(tài)q1、并且可以基于所述規(guī)定的轉(zhuǎn)變字符σ從任意狀態(tài)q轉(zhuǎn)變時(shí),追加基于所述規(guī)定的轉(zhuǎn)變字符σ的、從所述任意狀態(tài)q向所述規(guī)定狀態(tài)q1的狀態(tài)轉(zhuǎn)變。
4.根據(jù)權(quán)利要求1所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部利用散列表構(gòu)成所述狀態(tài)轉(zhuǎn)變表。
5.一種字符串對(duì)照裝置,其特征在于,具備狀態(tài)轉(zhuǎn)變表生成部,根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件,生成狀態(tài)轉(zhuǎn)變表;和自動(dòng)機(jī),根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變,其中,當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述狀態(tài)轉(zhuǎn)變表生成部不繼續(xù)讀入輸入字符,而是設(shè)定向規(guī)定狀態(tài)轉(zhuǎn)變的除外字符,生成狀態(tài)轉(zhuǎn)變表。
6.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述狀態(tài)轉(zhuǎn)變表生成部不繼續(xù)讀入輸入字符,而是生成向初始狀態(tài)轉(zhuǎn)變的狀態(tài)轉(zhuǎn)變表。
7.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于在輸入了多個(gè)對(duì)照條件時(shí),所述狀態(tài)轉(zhuǎn)變表生成部根據(jù)狀態(tài)的合并來(lái)進(jìn)行輸出描述的合并,生成輸出表,所述自動(dòng)機(jī)根據(jù)所述輸出表進(jìn)行輸出。
8.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于當(dāng)從某個(gè)狀態(tài)起存在基于任意字符的轉(zhuǎn)變目標(biāo)q1和基于規(guī)定的轉(zhuǎn)變字符σ的轉(zhuǎn)變目標(biāo)q2時(shí),所述狀態(tài)轉(zhuǎn)變表生成部用所述除外字符置換所述任意字符,并且用合并了q1和q2的狀態(tài)來(lái)置換基于所述規(guī)定的轉(zhuǎn)變字符σ的轉(zhuǎn)變目標(biāo)。
9.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于當(dāng)從某個(gè)狀態(tài)起存在多個(gè)基于所述除外字符的轉(zhuǎn)變目標(biāo)的狀態(tài)時(shí),所述狀態(tài)轉(zhuǎn)變表生成部用合并后的狀態(tài)來(lái)置換該多個(gè)狀態(tài)。
10.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部在合并規(guī)定的狀態(tài)q1、q2時(shí),在從q2起基于所述除外字符將狀態(tài)轉(zhuǎn)變至q3的情況下,合并以q1為起點(diǎn)的狀態(tài)轉(zhuǎn)變目標(biāo)和q3。
11.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部在生成NFA時(shí),生成將基于“.”的轉(zhuǎn)變作為任意字符轉(zhuǎn)變的狀態(tài)轉(zhuǎn)變。
12.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部在生成NFA時(shí),將基于“^a”的轉(zhuǎn)變置換成基于字符a的轉(zhuǎn)變和基于除外字符σother的轉(zhuǎn)變。
13.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部在通常字符和除外字符σother轉(zhuǎn)變成相同狀態(tài)時(shí),刪除基于通常字符的狀態(tài)轉(zhuǎn)變。
14.根據(jù)權(quán)利要求13所述的字符串對(duì)照裝置,其特征在于在通常字符和除外字符σother轉(zhuǎn)變成相同狀態(tài)時(shí),在刪除了基于通常字符的狀態(tài)轉(zhuǎn)變后,合并對(duì)于所有字符都轉(zhuǎn)變成相同狀態(tài)的多個(gè)狀態(tài),并且,在合并了對(duì)于所有字符都轉(zhuǎn)變成相同狀態(tài)的多個(gè)狀態(tài)之后,在通常字符和除外字符σother轉(zhuǎn)變成相同狀態(tài)時(shí),刪除基于通常字符的狀態(tài)轉(zhuǎn)變。
15.根據(jù)權(quán)利要求5所述的字符串對(duì)照裝置,其特征在于所述狀態(tài)轉(zhuǎn)變表生成部利用散列表構(gòu)成所述狀態(tài)轉(zhuǎn)變表。
16.一種控制計(jì)算機(jī)來(lái)執(zhí)行字符串對(duì)照的字符串對(duì)照程序,使所述計(jì)算機(jī)執(zhí)行如下處理根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件,生成狀態(tài)轉(zhuǎn)變表;和根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變,并且當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),不繼續(xù)讀入輸入字符,而是轉(zhuǎn)變到初始狀態(tài)。
17,一種控制計(jì)算機(jī)來(lái)執(zhí)行字符串對(duì)照的字符串對(duì)照程序,使所述計(jì)算機(jī)執(zhí)行如下處理根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件生成狀態(tài)轉(zhuǎn)變表,并且當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),不讀入輸入字符,而是設(shè)定轉(zhuǎn)變到規(guī)定狀態(tài)的除外字符,生成狀態(tài)轉(zhuǎn)變表;和根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變。
全文摘要
一種字符串對(duì)照裝置,具備狀態(tài)轉(zhuǎn)變表生成部,根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件,生成狀態(tài)轉(zhuǎn)變表;和自動(dòng)機(jī),根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變,其中,當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述自動(dòng)機(jī)不繼續(xù)讀入輸入字符,而是轉(zhuǎn)變到初始狀態(tài)。另外,具備狀態(tài)轉(zhuǎn)變表生成部,根據(jù)用正規(guī)表達(dá)描述的對(duì)照條件,生成狀態(tài)轉(zhuǎn)變表;和自動(dòng)機(jī),根據(jù)由所述狀態(tài)轉(zhuǎn)變表生成部生成的狀態(tài)轉(zhuǎn)變表進(jìn)行轉(zhuǎn)變,其中,當(dāng)根據(jù)所述對(duì)照條件生成的狀態(tài)轉(zhuǎn)變表中不存在針對(duì)當(dāng)前狀態(tài)和輸入字符的組的下一個(gè)轉(zhuǎn)變目標(biāo)狀態(tài)時(shí),所述狀態(tài)轉(zhuǎn)變表生成部不繼續(xù)讀入輸入字符,而是設(shè)定向規(guī)定狀態(tài)轉(zhuǎn)變的除外字符,生成狀態(tài)轉(zhuǎn)變表。
文檔編號(hào)G06F17/30GK101076798SQ200480044570
公開(kāi)日2007年11月21日 申請(qǐng)日期2004年12月9日 優(yōu)先權(quán)日2004年12月9日
發(fā)明者郡光則 申請(qǐng)人:三菱電機(jī)株式會(huì)社
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1