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

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

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

  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狀態的所有等價NFA狀態進行遍歷
 16                 const IReadonlyList<State*>& nfaStates=dfaStateMap[currentState];
 17                 for(int j=0;j<nfaStates.Count();j++)
 18                 {
 19                     State* nfaState=nfaStates[j];
 20                     //對每一個NFA狀態的所有轉換進行遍歷
 21                     for(int k=0;k<nfaState->transitions.Count();k++)
 22                     {
 23                         Transition* nfaTransition=nfaState->transitions[k];
 24                         //檢查該NFA轉換類型是否已經具有已經被記錄
 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                         //不存在則創建一個轉換類型
 36                         if(transitionClass==0)
 37                         {
 38                             transitionClass=nfaTransition;
 39                         }
 40                         //注冊轉換
 41                         nfaTransitions.Add(transitionClass, nfaTransition);
 42                     }
 43                 }
 44 
 45                 //遍歷所有種類的NFA轉換
 46                 for(int j=0;j<nfaTransitions.Count();j++)
 47                 {
 48                     const IReadonlyList<Transition*>& transitionSet=nfaTransitions.GetByIndex(j);
 49                     //對所有轉換的NFA目標狀態集合進行排序
 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                     //判斷轉換類的所有轉換的NFA目標狀態組成的集合是否已經有一個對應的DFA狀態
 60                     State* dfaState=0;
 61                     for(int k=0;k<dfaStateMap.Count();k++)
 62                     {
 63                         //將DFA的等價NFA狀態集合進行排序
 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                     //不存在等價DFA狀態則創建一個
 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                     //將該轉換復制到新狀態機里
 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作為數據結構來計算。Group是一個多對多映射,也就是說Group<K, V>的內部結構等價于Map<K, List<V>>。從NFA到DFA轉換的同時,這個函數還記錄了每一個DFA對象所對應的NFA對象集合。

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

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

轉眼就兩年了。

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

這個東西熱愛計算機編程的人都該嘗試去做下。非??蓟竟??;镜臄祿Y構,stack, avl tree, map, bit-vector, list都有牽涉,而算法那塊也逃不出一般算法書的經典算法部分,編譯原理也有部分涉及。假如你是個學生,又不知道該做點啥,那么這個東西,你該試著做做。

  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA)[未登錄] 2009-11-04 07:06 | L.S.Winson
話說你寫這NFA到DFA轉換寫了多少次了。。。。我都覺得寫這算法寫得麻木了。。。
怎么又把你的VL重寫么?  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA) 2009-11-04 20:57 | 陳梓瀚(vczh)
@L.S.Winson
嗯,這個前面說過了,因為有重大升級,所以全部重寫。  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA) 2009-11-04 20:57 | 陳梓瀚(vczh)
@白開水
我也很懷念之前你那個正則表達式啊,嘿嘿  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA) 2009-11-06 16:17 | zblc
@白開水
啊 你就是傳說中的vczh的徒弟~收我為徒吧~  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA) 2009-11-07 05:16 | 陳梓瀚(vczh)
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA) 2009-11-08 01:12 | v.k
囧, 怎么你的徒弟走上C#了  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(從NFA到DFA) 2009-11-08 07:35 | 陳梓瀚(vczh)
@v.k
人總是要多學點的  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩一区二区| 黑人中文字幕一区二区三区| 国产精品你懂的| 国产精品婷婷| 日韩午夜激情| 久久天天躁狠狠躁夜夜爽蜜月| 一区二区三区高清不卡| 欧美成人激情视频免费观看| 伊人精品久久久久7777| 久久免费视频这里只有精品| 午夜精品免费视频| 国产精品视频| 久久久91精品国产| 欧美一区二区三区四区高清| 国产欧美日韩综合一区在线观看 | 欧美国产日韩一区二区在线观看 | 国产在线视频欧美| 欧美中文字幕在线播放| 亚洲午夜av| 国产欧美日韩在线| 老鸭窝毛片一区二区三区| 久久国产手机看片| 在线欧美日韩国产| 亚洲高清在线观看| 欧美精品亚洲精品| 中文一区二区| 亚洲在线一区二区| 国产亚洲美州欧州综合国| 久久久亚洲欧洲日产国码αv | 欧美呦呦网站| 伊人婷婷久久| 亚洲韩国日本中文字幕| 欧美久久久久久| 亚洲欧美视频一区二区三区| 亚洲欧美日韩第一区| 黄色成人免费网站| 亚洲国产精品女人久久久| 欧美日韩综合久久| 久久精品国产视频| 欧美wwwwww| 午夜精品久久久久久久久久久久| 欧美在线啊v一区| 亚洲精品影视| 香蕉久久国产| 久久婷婷国产综合精品青草| 免费日韩av片| 一区二区三区国产| 欧美一级黄色录像| 日韩视频在线一区二区三区| 亚洲色图制服丝袜| 亚洲国产毛片完整版| 一区二区三区导航| 亚洲国产精选| 亚洲在线成人精品| 亚洲精品欧美日韩专区| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲性图久久| 在线播放日韩专区| 亚洲午夜三级在线| 亚洲精品在线观| 午夜在线一区| 亚洲一区二区三区高清不卡| 久久综合国产精品| 久久精品主播| 国产精品推荐精品| 日韩午夜av电影| 亚洲国产成人精品久久| 午夜精品免费视频| 亚洲自拍啪啪| 欧美激情成人在线| 欧美fxxxxxx另类| 国产日韩一区二区三区在线播放| 亚洲三级免费观看| 亚洲第一在线综合网站| 欧美在线啊v| 久久国产日韩| 国产麻豆日韩欧美久久| 一区二区三区www| 日韩天天综合| 欧美精品一区二| 亚洲电影免费在线| 亚洲国产欧美日韩精品| 老牛国产精品一区的观看方式| 久久精品国产99国产精品| 国产精品久久久久毛片大屁完整版| 91久久极品少妇xxxxⅹ软件| 亚洲国产日日夜夜| 久久久中精品2020中文| 久久久免费精品视频| 国产性做久久久久久| 香蕉久久夜色精品| 久久岛国电影| 国产自产精品| 久久九九国产精品| 久久久久久久性| 伊人成年综合电影网| 久久精品综合网| 欧美电影免费观看高清完整版| 伊人久久男人天堂| 免费成人美女女| 亚洲三级性片| 午夜日韩激情| 狠狠综合久久| 免费不卡亚洲欧美| 日韩午夜在线播放| 欧美一区二区三区久久精品茉莉花 | 欧美激情视频在线播放| 亚洲国产三级在线| 欧美电影在线观看| 日韩一级精品| 亚洲欧美日本伦理| 国产情人综合久久777777| 欧美亚洲一区二区在线观看| 久久久久久一区二区| 尤物九九久久国产精品的特点| 久久综合久久美利坚合众国| 亚洲黄色在线| 欧美亚洲在线| 精品动漫一区二区| 亚洲国产合集| 亚洲一区区二区| 国产一区二区高清| 久久久国产成人精品| 亚洲黄色免费电影| 亚洲免费在线电影| 黄色小说综合网站| 欧美久久久久久久| 欧美影院在线| 亚洲精品美女91| 久久精品国产v日韩v亚洲| 91久久黄色| 国产欧美亚洲一区| 欧美va天堂va视频va在线| 亚洲午夜免费视频| 欧美黄色一区二区| 欧美一区二区视频97| 亚洲大片av| 国产精品视频网| 欧美不卡视频一区| 午夜精品久久久久久久男人的天堂| 欧美激情一区二区三区在线视频观看 | 在线观看日韩一区| 欧美日韩影院| 美女精品网站| 亚洲欧美综合精品久久成人| 亚洲国产第一页| 巨乳诱惑日韩免费av| 亚洲国产欧美一区| 国内精品久久久久影院薰衣草| 欧美日韩成人在线观看| 久久亚洲美女| 欧美一级视频| 亚洲素人一区二区| 亚洲精品在线三区| 在线视频欧美一区| 亚洲成色精品| 精品成人免费| 国产视频综合在线| 国产精品日韩欧美一区二区三区| 欧美a级在线| 久久午夜精品一区二区| 性欧美超级视频| 亚洲视频一二| 99在线精品视频在线观看| 欧美激情 亚洲a∨综合| 久久综合福利| 韩国一区二区在线观看| 羞羞答答国产精品www一本| 亚洲精品乱码久久久久久蜜桃麻豆| 免播放器亚洲一区| 久色婷婷小香蕉久久| 久久婷婷国产麻豆91天堂| 久久精品五月| 久久久久久久一区二区| 久久久久网站| 亚洲精品美女在线观看播放| 亚洲在线观看视频网站| 9人人澡人人爽人人精品| 亚洲精品午夜精品| 亚洲欧洲精品一区二区三区| 亚洲国产欧美在线 | 欧美激情视频一区二区三区免费 | 欧美激情第六页| 免费一级欧美片在线播放| 麻豆九一精品爱看视频在线观看免费| 久久久久国产精品一区| 久久久久久综合网天天| 久久日韩粉嫩一区二区三区| 久久免费视频这里只有精品| 鲁大师成人一区二区三区| 欧美成人综合在线| 亚洲国产一区二区a毛片| 午夜精品久久久久久久99樱桃 | 国产乱码精品一区二区三区不卡| 欧美日韩一区二区三区在线观看免 | 亚洲线精品一区二区三区八戒| 亚洲一区二区三区乱码aⅴ| 欧美亚洲一区| 欧美.日韩.国产.一区.二区| 欧美日本中文|