青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    算法的具體說明可以看這里

    今天花了一個(gè)晚上完成并測試了從NFA到DFA的代碼。NFA到DFA的主要過程就是構(gòu)造出一個(gè)等價(jià)于NFA的狀態(tài)機(jī),使得從任何一個(gè)狀態(tài)出去的狀態(tài)轉(zhuǎn)換都不具有相同的條件。這個(gè)約束就是“確定性”的含義,給定一個(gè)狀態(tài)和一個(gè)輸入,最多只能跳轉(zhuǎn)到一個(gè)目標(biāo)狀態(tài)。于是知道了這個(gè)過程,代碼就很好寫了:

  1         Automaton::Ref NfaToDfa(Automaton::Ref source, IGroup<State*, State*>& dfaStateMap)
  2         {
  3             Automaton::Ref target=new Automaton;
  4             Group<Transition*, Transition*> nfaTransitions;
  5             CopyFrom(target->captureNames.Wrap(), source->captureNames.Wrap());
  6             State* startState=target->NewState();
  7             target->startState=startState;
  8             dfaStateMap.Add(startState, source->startState);
  9 
 10             for(int i=0;i<target->states.Count();i++)
 11             {
 12                 State* currentState=target->states[i].Obj();
 13                 nfaTransitions.Clear();
 14 
 15                 //對該DFA狀態(tài)的所有等價(jià)NFA狀態(tài)進(jìn)行遍歷
 16                 const IReadonlyList<State*>& nfaStates=dfaStateMap[currentState];
 17                 for(int j=0;j<nfaStates.Count();j++)
 18                 {
 19                     State* nfaState=nfaStates[j];
 20                     //對每一個(gè)NFA狀態(tài)的所有轉(zhuǎn)換進(jìn)行遍歷
 21                     for(int k=0;k<nfaState->transitions.Count();k++)
 22                     {
 23                         Transition* nfaTransition=nfaState->transitions[k];
 24                         //檢查該NFA轉(zhuǎn)換類型是否已經(jīng)具有已經(jīng)被記錄
 25                         Transition* transitionClass=0;
 26                         for(int l=0;l<nfaTransitions.Keys().Count();l++)
 27                         {
 28                             Transition* key=nfaTransitions.Keys()[l];
 29                             if(AreEqual(key, nfaTransition))
 30                             {
 31                                 transitionClass=key;
 32                                 break;
 33                             }
 34                         }
 35                         //不存在則創(chuàng)建一個(gè)轉(zhuǎn)換類型
 36                         if(transitionClass==0)
 37                         {
 38                             transitionClass=nfaTransition;
 39                         }
 40                         //注冊轉(zhuǎn)換
 41                         nfaTransitions.Add(transitionClass, nfaTransition);
 42                     }
 43                 }
 44 
 45                 //遍歷所有種類的NFA轉(zhuǎn)換
 46                 for(int j=0;j<nfaTransitions.Count();j++)
 47                 {
 48                     const IReadonlyList<Transition*>& transitionSet=nfaTransitions.GetByIndex(j);
 49                     //對所有轉(zhuǎn)換的NFA目標(biāo)狀態(tài)集合進(jìn)行排序
 50                     SortedList<State*> transitionTargets;
 51                     for(int l=0;l<transitionSet.Count();l++)
 52                     {
 53                         State* nfaState=transitionSet[l]->target;
 54                         if(!transitionTargets.Contains(nfaState))
 55                         {
 56                             transitionTargets.Add(nfaState);
 57                         }
 58                     }
 59                     //判斷轉(zhuǎn)換類的所有轉(zhuǎn)換的NFA目標(biāo)狀態(tài)組成的集合是否已經(jīng)有一個(gè)對應(yīng)的DFA狀態(tài)
 60                     State* dfaState=0;
 61                     for(int k=0;k<dfaStateMap.Count();k++)
 62                     {
 63                         //將DFA的等價(jià)NFA狀態(tài)集合進(jìn)行排序
 64                         SortedList<State*> relativeStates;
 65                         CopyFrom(relativeStates.Wrap(), dfaStateMap.GetByIndex(k));
 66                         //比較兩者是否相等
 67                         if(relativeStates.Count()==transitionTargets.Count())
 68                         {
 69                             bool equal=true;
 70                             for(int l=0;l<relativeStates.Count();l++)
 71                             {
 72                                 if(relativeStates[l]!=transitionTargets[l])
 73                                 {
 74                                     equal=false;
 75                                     break;
 76                                 }
 77                             }
 78                             if(equal)
 79                             {
 80                                 dfaState=dfaStateMap.Keys()[k];
 81                                 break;
 82                             }
 83                         }
 84                     }
 85                     //不存在等價(jià)DFA狀態(tài)則創(chuàng)建一個(gè)
 86                     if(!dfaState)
 87                     {
 88                         dfaState=target->NewState();
 89                         for(int k=0;k<transitionTargets.Count();k++)
 90                         {
 91                             dfaStateMap.Add(dfaState, transitionTargets[k]);
 92                             if(transitionTargets[k]->finalState)
 93                             {
 94                                 dfaState->finalState=true;
 95                             }
 96                         }
 97                     }
 98                     //將該轉(zhuǎn)換復(fù)制到新狀態(tài)機(jī)里
 99                     Transition* transitionClass=nfaTransitions.Keys()[j];
100                     Transition* newTransition=target->NewTransition(currentState, dfaState);
101                     newTransition->capture=transitionClass->capture;
102                     newTransition->index=transitionClass->index;
103                     newTransition->range=transitionClass->range;
104                     newTransition->type=transitionClass->type;
105                 }
106             }
107 
108             return target;
109         }

    這里頻繁使用了Group和IGroup作為數(shù)據(jù)結(jié)構(gòu)來計(jì)算。Group是一個(gè)多對多映射,也就是說Group<K, V>的內(nèi)部結(jié)構(gòu)等價(jià)于Map<K, List<V>>。從NFA到DFA轉(zhuǎn)換的同時(shí),這個(gè)函數(shù)還記錄了每一個(gè)DFA對象所對應(yīng)的NFA對象集合。

    接下來就要分兩步走了,第一個(gè)先做純匹配的正則表達(dá)式,然后接著做貪婪匹配(包含捕獲、預(yù)查和指向捕獲的匹配等高級功能)。根據(jù)Vczh Library++2.0的經(jīng)驗(yàn),純匹配的正則表達(dá)式用來實(shí)現(xiàn)詞法分析器的時(shí)候,不亞于純手寫的詞法分析器,這一點(diǎn)令他的應(yīng)用范圍變廣。
posted on 2009-11-03 08:34 陳梓瀚(vczh) 閱讀(2748) 評論(8)  編輯 收藏 引用 所屬分類: VL++3.0開發(fā)紀(jì)事

評論:
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-03 22:49 | 白開水
看到這個(gè)文章,突然感覺很懷念,真正把我編程帶入門的文章。

轉(zhuǎn)眼就兩年了。

正則表達(dá)式引擎到了后面效率可能會卡在內(nèi)存的吞吐上,一般的PC配置(這個(gè)一般我也不太確定),極限應(yīng)該在30MB/S.

這個(gè)東西熱愛計(jì)算機(jī)編程的人都該嘗試去做下。非常考基本功。基本的數(shù)據(jù)結(jié)構(gòu),stack, avl tree, map, bit-vector, list都有牽涉,而算法那塊也逃不出一般算法書的經(jīng)典算法部分,編譯原理也有部分涉及。假如你是個(gè)學(xué)生,又不知道該做點(diǎn)啥,那么這個(gè)東西,你該試著做做。

  回復(fù)  更多評論
  
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA)[未登錄] 2009-11-04 07:06 | L.S.Winson
話說你寫這NFA到DFA轉(zhuǎn)換寫了多少次了。。。。我都覺得寫這算法寫得麻木了。。。
怎么又把你的VL重寫么?  回復(fù)  更多評論
  
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-04 20:57 | 陳梓瀚(vczh)
@L.S.Winson
嗯,這個(gè)前面說過了,因?yàn)橛兄卮笊墸匀恐貙憽?nbsp; 回復(fù)  更多評論
  
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-04 20:57 | 陳梓瀚(vczh)
@白開水
我也很懷念之前你那個(gè)正則表達(dá)式啊,嘿嘿  回復(fù)  更多評論
  
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-06 16:17 | zblc
@白開水
啊 你就是傳說中的vczh的徒弟~收我為徒吧~  回復(fù)  更多評論
  
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-07 05:16 | 陳梓瀚(vczh)
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-08 01:12 | v.k
囧, 怎么你的徒弟走上C#了  回復(fù)  更多評論
  
# re: Vczh Library++3.0之正則表達(dá)式引擎(從NFA到DFA) 2009-11-08 07:35 | 陳梓瀚(vczh)
@v.k
人總是要多學(xué)點(diǎn)的  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久久五月尺| 久久精品99国产精品日本| 欧美黑人在线播放| 最新日韩精品| 亚洲美女电影在线| 欧美日韩综合| 新狼窝色av性久久久久久| 女人色偷偷aa久久天堂| 亚洲精品资源美女情侣酒店| 欧美午夜精品久久久| 亚洲欧美久久久久一区二区三区| 久久免费视频在线| 91久久国产综合久久| 欧美午夜视频网站| 久久av一区二区| 亚洲黄页视频免费观看| 亚洲欧美久久久| 伊人久久噜噜噜躁狠狠躁| 欧美黑人多人双交| 欧美一区二区三区在| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区精品在线| 国产一区二区三区久久久| 欧美成人性网| 亚洲欧美激情视频在线观看一区二区三区 | 国产精品久久久久久影视 | 亚洲高清中文字幕| 亚洲自拍都市欧美小说| 亚洲成人资源网| 欧美日韩精品一二三区| 欧美一级片在线播放| 亚洲精美视频| 久久人人爽人人| 亚洲一级黄色| 亚洲国产一区二区精品专区| 国产精品日韩久久久| 欧美粗暴jizz性欧美20| 欧美一区二区三区四区在线观看| 最新日韩精品| 免费精品视频| 欧美在线高清视频| 一本色道久久综合亚洲精品婷婷 | 久久免费精品日本久久中文字幕| 亚洲精品综合| 韩国av一区二区三区在线观看| 欧美精品一区二区三区在线播放 | 91久久国产综合久久91精品网站| 性欧美1819性猛交| av不卡在线观看| 亚洲国产精品黑人久久久| 国产精品卡一卡二| 欧美喷潮久久久xxxxx| 久久久亚洲高清| 午夜精品一区二区三区四区 | 亚洲免费在线观看视频| 亚洲免费观看高清完整版在线观看熊 | 久久av一区二区三区| 亚洲午夜三级在线| 日韩一级黄色片| 最新中文字幕亚洲| 亚洲高清免费| 亚洲福利视频一区二区| 国产亚洲激情视频在线| 国产精品亚洲综合| 国产精品色网| 国产精品久久久久久久久久免费| 欧美日本国产精品| 欧美极品色图| 欧美日韩国产免费| 欧美日韩国产综合久久| 欧美日韩1区| 欧美日韩三级一区二区| 欧美日韩精选| 欧美日韩在线视频一区二区| 欧美三级在线| 国产精品久久久久天堂| 国产精品区免费视频| 国产欧美69| 国内精品美女av在线播放| 国产一区在线看| 一区三区视频| 亚洲欧洲日韩综合二区| 亚洲免费电影在线| 国产精品99久久久久久有的能看| 亚洲婷婷综合色高清在线| 亚洲一区二区三区四区视频 | 99视频精品全部免费在线| 日韩一级裸体免费视频| 中日韩高清电影网| 亚洲欧美在线x视频| 欧美中文字幕| 欧美88av| 国产精品久久99| 国内精品嫩模av私拍在线观看 | 国产女优一区| 黄色精品一区| 日韩亚洲国产欧美| 亚洲综合首页| 久久亚洲精品视频| 亚洲高清二区| 亚洲天堂视频在线观看| 欧美在线视频日韩| 欧美久久综合| 国产色综合网| 亚洲精品偷拍| 欧美专区在线播放| 亚洲电影成人| 亚洲一区3d动漫同人无遮挡| 欧美在线一二三区| 欧美日韩亚洲高清| 黑人一区二区| 在线视频欧美精品| 久久久久久午夜| 亚洲美女在线看| 久久国产欧美日韩精品| 欧美理论在线播放| 国产亚洲永久域名| 99亚洲一区二区| 久久综合久久久久88| 99re8这里有精品热视频免费| 欧美一区二区视频在线| 欧美精品一线| 在线观看日韩av电影| 亚洲欧美日韩精品久久久久| 欧美成人午夜激情在线| 亚洲免费视频观看| 欧美日韩国产二区| 伊人久久久大香线蕉综合直播| 亚洲影视综合| 亚洲福利在线观看| 久久久www免费人成黑人精品 | 夜夜嗨av一区二区三区网页| 久久久久久尹人网香蕉| 亚洲图片你懂的| 欧美激情在线免费观看| 1000部国产精品成人观看| 亚洲欧美在线看| 亚洲另类一区二区| 欧美成人dvd在线视频| 激情欧美亚洲| 久久激情网站| 午夜精品国产| 国产精品久久中文| 亚洲少妇自拍| 亚洲美女精品久久| 欧美激情按摩| 最新国产成人在线观看| 欧美大胆a视频| 久久激情综合| 国产一区二区三区久久 | 欧美99在线视频观看| 一区二区在线不卡| 久久综合久久久久88| 欧美中文在线免费| 国产一区二区精品久久| 欧美在线视频二区| 亚洲欧美国产不卡| 国产乱码精品一区二区三区不卡 | 欧美一级在线视频| 国内精品久久久久久久影视蜜臀 | 久久天堂精品| 亚洲电影免费在线观看| 美女主播精品视频一二三四| 久久久午夜视频| 亚洲国产精品一区二区www在线| 久色婷婷小香蕉久久| 久久免费视频在线| 亚洲国产成人久久| 亚洲国产欧美日韩| 欧美区在线观看| 亚洲免费影院| 午夜欧美精品| 精品福利av| 欧美不卡视频一区发布| 欧美大片免费观看| 正在播放欧美视频| 亚洲在线1234| 极品少妇一区二区三区精品视频| 蜜桃久久av一区| 欧美好吊妞视频| 99视频热这里只有精品免费| 99成人精品| 国产精品一区一区三区| 久久综合伊人77777麻豆| 美女主播视频一区| 亚洲图片欧洲图片日韩av| 亚洲欧美乱综合| 1024成人| 一区二区三区av| 国产一区激情| 最近看过的日韩成人| 国产精品久久久久一区二区| 久久久久久久欧美精品| 欧美chengren| 欧美一区二区三区免费大片| 久久久亚洲高清| 亚洲视频日本| 久久蜜桃资源一区二区老牛| 一本色道久久99精品综合| 欧美在线国产|