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

隨筆-341  評論-2670  文章-0  trackbacks-0
    不知道什么是epsilon-NFA的話先看這里

    從正則表達式生成epsilon-NFA其實跟將一棵樹變換成另一棵樹是類似的。epsilon轉換提供了一種工具讓我們可以把一個圖表達成漂亮的形式,看起來就有典型的遞歸結構。因此這個工作依然可以用RegexExpressionAlgorithm這個visitor模式的產物來解決:
  1         class EpsilonNfaInfo
  2         {
  3         public:
  4             Automaton::Ref        automaton;
  5         };
  6 
  7         class EpsilonNfa
  8         {
  9         public:
 10             State*                start;
 11             State*                end;
 12 
 13             EpsilonNfa()
 14             {
 15                 start=0;
 16                 end=0;
 17             }
 18         };
 19 
 20         class EpsilonNfaAlgorithm : public RegexExpressionAlgorithm<EpsilonNfa, Automaton*>
 21         {
 22         public:
 23             EpsilonNfa Connect(EpsilonNfa a, EpsilonNfa b, Automaton* target)
 24             {
 25                 if(a.start)
 26                 {
 27                     target->NewEpsilon(a.end, b.start);
 28                     a.end=b.end;
 29                     return a;
 30                 }
 31                 else
 32                 {
 33                     return b;
 34                 }
 35             }
 36 
 37             EpsilonNfa Apply(CharSetExpression* expression, Automaton* target)
 38             {
 39                 EpsilonNfa nfa;
 40                 nfa.start=target->NewState();
 41                 nfa.end=target->NewState();
 42                 for(int i=0;i<expression->ranges.Count();i++)
 43                 {
 44                     target->NewChars(nfa.start, nfa.end, expression->ranges[i]);
 45                 }
 46                 return nfa;
 47             }
 48 
 49             EpsilonNfa Apply(LoopExpression* expression, Automaton* target)
 50             {
 51                 EpsilonNfa head;
 52                 for(int i=0;i<expression->min;i++)
 53                 {
 54                     EpsilonNfa body=Invoke(expression->expression, target);
 55                     head=Connect(head, body, target);
 56                 }
 57                 if(expression->max==-1)
 58                 {
 59                     EpsilonNfa body=Invoke(expression->expression, target);
 60                     if(!head.start)
 61                     {
 62                         head.start=head.end=target->NewState();
 63                     }
 64                     target->NewEpsilon(head.end, body.start);
 65                     target->NewEpsilon(body.end, head.end);
 66                 }
 67                 else if(expression->max>expression->min)
 68                 {
 69                     for(int i=expression->min;i<expression->max;i++)
 70                     {
 71                         EpsilonNfa body=Invoke(expression->expression, target);
 72                         target->NewEpsilon(body.start, body.end);
 73                         head=Connect(head, body, target);
 74                     }
 75                 }
 76                 return head;
 77             }
 78 
 79             EpsilonNfa Apply(SequenceExpression* expression, Automaton* target)
 80             {
 81                 EpsilonNfa a=Invoke(expression->left, target);
 82                 EpsilonNfa b=Invoke(expression->right, target);
 83                 return Connect(a, b, target);
 84             }
 85 
 86             EpsilonNfa Apply(AlternateExpression* expression, Automaton* target)
 87             {
 88                 EpsilonNfa result;
 89                 result.start=target->NewState();
 90                 result.end=target->NewState();
 91                 EpsilonNfa a=Invoke(expression->left, target);
 92                 EpsilonNfa b=Invoke(expression->right, target);
 93                 target->NewEpsilon(result.start, a.start);
 94                 target->NewEpsilon(a.end, result.end);
 95                 target->NewEpsilon(result.start, b.start);
 96                 target->NewEpsilon(b.end, result.end);
 97                 return result;
 98             }
 99 
100             EpsilonNfa Apply(BeginExpression* expression, Automaton* target)
101             {
102                 EpsilonNfa result;
103                 result.start=target->NewState();
104                 result.end=target->NewState();
105                 target->NewBeginString(result.start, result.end);
106                 return result;
107             }
108 
109             EpsilonNfa Apply(EndExpression* expression, Automaton* target)
110             {
111                 EpsilonNfa result;
112                 result.start=target->NewState();
113                 result.end=target->NewState();
114                 target->NewEndString(result.start, result.end);
115                 return result;
116             }
117 
118             EpsilonNfa Apply(CaptureExpression* expression, Automaton* target)
119             {
120                 EpsilonNfa result;
121                 result.start=target->NewState();
122                 result.end=target->NewState();
123 
124                 int capture=-1;
125                 if(expression->name!=L"")
126                 {
127                     capture=target->captureNames.IndexOf(expression->name);
128                     if(capture==-1)
129                     {
130                         capture=target->captureNames.Count();
131                         target->captureNames.Add(expression->name);
132                     }
133                 }
134 
135                 EpsilonNfa body=Invoke(expression->expression, target);
136                 target->NewCapture(result.start, body.start, capture);
137                 target->NewEnd(body.end, result.end);
138                 return result;
139             }
140 
141             EpsilonNfa Apply(MatchExpression* expression, Automaton* target)
142             {
143                 int capture=-1;
144                 if(expression->name!=L"")
145                 {
146                     capture=target->captureNames.IndexOf(expression->name);
147                     if(capture==-1)
148                     {
149                         capture=target->captureNames.Count();
150                         target->captureNames.Add(expression->name);
151                     }
152                 }
153                 EpsilonNfa result;
154                 result.start=target->NewState();
155                 result.end=target->NewState();
156                 target->NewMatch(result.start, result.end, capture, expression->index);
157                 return result;
158             }
159 
160             EpsilonNfa Apply(PositiveExpression* expression, Automaton* target)
161             {
162                 EpsilonNfa result;
163                 result.start=target->NewState();
164                 result.end=target->NewState();
165                 EpsilonNfa body=Invoke(expression->expression, target);
166                 target->NewPositive(result.start, body.start);
167                 target->NewEnd(body.end, result.end);
168                 return result;
169             }
170 
171             EpsilonNfa Apply(NegativeExpression* expression, Automaton* target)
172             {
173                 EpsilonNfa result;
174                 result.start=target->NewState();
175                 result.end=target->NewState();
176                 EpsilonNfa body=Invoke(expression->expression, target);
177                 target->NewNegative(result.start, body.start);
178                 target->NewEnd(body.end, result.end);
179                 return result;
180             }
181 
182             EpsilonNfa Apply(UsingExpression* expression, Automaton* target)
183             {
184                 CHECK_ERROR(false, L"RegexExpression::GenerateEpsilonNfa()#UsingExpression不能產生狀態機。");
185             }
186         };

    當然,為了讓上面的代碼成功,我們還需要一個描述狀態機的結構:
 1 /***********************************************************************
 2 Vczh Library++ 3.0
 3 Developer: 陳梓瀚(vczh)
 4 Regex::RegexAutomaton
 5 
 6 Classes:
 7 ***********************************************************************/
 8 
 9 #ifndef VCZH_REGEX_REGEXAUTOMATON
10 #define VCZH_REGEX_REGEXAUTOMATON
11 
12 #include "RegexData.h"
13 
14 namespace vl
15 {
16     namespace regex_internal
17     {
18         class State;
19         class Transition;
20 
21         class Transition
22         {
23         public:
24             enum Type
25             {
26                 Chars,                //range為字符范圍
27                 Epsilon,
28                 BeginString,
29                 EndString,
30                 Capture,            //capture為捕獲頻道
31                 Match,                //capture為捕獲頻道,index為匹配的位置,-1代表匹配頻道下面的所有項目
32                 Positive,            //
33                 Negative,            //
34                 End                    //Capture, Position, Negative
35             };
36 
37             State*                    source;
38             State*                    target;
39             CharRange                range;
40             Type                    type;
41             int                        capture;
42             int                        index;
43         };
44 
45         class State
46         {
47         public:
48             List<Transition*>        transitions;
49             List<Transition*>        inputs;
50             bool                    finalState;
51         };
52 
53         class Automaton
54         {
55         public:
56             typedef Ptr<Automaton>        Ref;
57 
58             List<Ptr<State>>        states;
59             List<Ptr<Transition>>    transitions;
60             List<WString>            captureNames;
61             State*                    startState;
62 
63             Automaton();
64 
65             State*                    NewState();
66             Transition*                NewTransition(State* start, State* end);
67             Transition*                NewChars(State* start, State* end, CharRange range);
68             Transition*                NewEpsilon(State* start, State* end);
69             Transition*                NewBeginString(State* start, State* end);
70             Transition*                NewEndString(State* start, State* end);
71             Transition*                NewCapture(State* start, State* end, int capture);
72             Transition*                NewMatch(State* start, State* end, int capture, int index=-1);
73             Transition*                NewPositive(State* start, State* end);
74             Transition*                NewNegative(State* start, State* end);
75             Transition*                NewEnd(State* start, State* end);
76         };
77     }
78 }
79 
80 #endif

    這里Automaton::New×××都是一些輔助建立圖結構的函數,就不詳細描述了。于是讓我們看一個例子,譬如說分析一個字符串是不是C語言的注釋:/\*([^*]|\*+[^*/])*\*+/
 1 [START]State<0>
 2     To State<1> : <Char : 47[/- 47[/]>
 3 State<1>
 4     To State<2> : <Epsilon>
 5 State<2>
 6     To State<3> : <Char : 42[*- 42[*]>
 7 State<3>
 8     To State<14> : <Epsilon>
 9 State<4>
10     To State<6> : <Epsilon>
11     To State<8> : <Epsilon>
12 State<5>
13     To State<14> : <Epsilon>
14 State<6>
15     To State<7> : <Char : 1[] - 41[)]>
16     To State<7> : <Char : 43[+- 46[.]>
17     To State<7> : <Char : 47[/- 47[/]>
18          To State<7> : <Char : 48[0- 65535?[]>
19 State<7>
20     To State<5> : <Epsilon>
21 State<8>
22     To State<9> : <Char : 42[*- 42[*]>
23 State<9>
24     To State<10> : <Epsilon>
25     To State<12> : <Epsilon>
26 State<10>
27     To State<11> : <Char : 42[*- 42[*]>
28 State<11>
29     To State<9> : <Epsilon>
30 State<12>
31     To State<13> : <Char : 1[] - 41[)]>
32     To State<13> : <Char : 43[+- 46[.]>
33     To State<13> : <Char : 48[0- 65535[]>
34 State<13>
35     To State<5> : <Epsilon>
36 State<14>
37     To State<4> : <Epsilon>
38     To State<15> : <Epsilon>
39 State<15>
40     To State<16> : <Char : 42[*- 42[*]>
41 State<16>
42     To State<17> : <Epsilon>
43     To State<19> : <Epsilon>
44 State<17>
45     To State<18> : <Char : 42[*- 42[*]>
46 State<18>
47     To State<16> : <Epsilon>
48 State<19>
49     To State<20> : <Char : 47[/- 47[/]>
50 [FINISH]State<20>
51 
posted on 2009-10-24 00:23 陳梓瀚(vczh) 閱讀(2298) 評論(5)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

評論:
# re: Vczh Library++3.0之正則表達式引擎(生成epsilon-NFA) 2009-10-24 06:49 | 彭小虎(Tigerkin)
V兄又開始高產了  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(生成epsilon-NFA) 2009-10-24 17:56 | 李佳
真牛 自己寫正則表達式的解析引擎 ... 我用的還不大熟...  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(生成epsilon-NFA)[未登錄] 2009-10-25 17:09 | jans2002
感謝如此精彩的正則引擎DIY教程。  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(生成epsilon-NFA) 2009-10-25 20:47 | 凡客誠品
感謝如此精彩的正則引擎DIY教程  回復  更多評論
  
# re: Vczh Library++3.0之正則表達式引擎(生成epsilon-NFA) 2009-11-28 22:03 | radar
感謝如此精彩的正則引擎DIY教程  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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亚洲伊人久久精品影院红桃| 老司机免费视频久久| 亚洲黄色毛片| 最近中文字幕mv在线一区二区三区四区| 久久深夜福利| aa日韩免费精品视频一| 一区二区三区.www| 国产一区二区| 亚洲电影天堂av| 欧美揉bbbbb揉bbbbb| 亚洲欧美综合国产精品一区| 欧美一区二区高清| 91久久午夜| 亚洲午夜视频在线| 亚洲福利av| 亚洲新中文字幕| 在线观看三级视频欧美| 亚洲精品偷拍| 一区二区三区在线观看国产| 亚洲精品免费一区二区三区| 国产日韩欧美在线看| 欧美高清视频一区| 国产精品嫩草99a| 欧美国产日韩精品| 国产精品视频yy9099| 免费成人av在线| 国产精品久久久一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 欧美a级在线| 欧美资源在线| 欧美午夜一区二区| 欧美国产视频日韩| 国产亚洲美州欧州综合国| 亚洲精品一二三区| 亚洲二区视频在线| 欧美一级视频一区二区| 一区二区欧美在线| 欧美福利精品| 麻豆精品在线视频| 国产欧美精品久久| 一区二区欧美视频| 亚洲日本无吗高清不卡| 欧美在线www| 欧美一区二区三区精品| 欧美日韩成人综合天天影院| 久久久99国产精品免费| 国产精品日韩| 一个人看的www久久| 亚洲精品在线免费| 免费看精品久久片| 欧美a一区二区| 好看的日韩视频| 亚洲欧美综合网| 小黄鸭视频精品导航| 久久永久免费| 激情成人av| 久久九九精品99国产精品| 久久av资源网| 国产日韩欧美在线一区| 亚洲欧美文学| 久久久欧美精品sm网站| 国产人成精品一区二区三| 亚洲在线中文字幕| 欧美在线免费视频| 欧美成人一品| 亚洲承认在线| 欧美永久精品| 免费视频一区| 亚洲激情偷拍| 欧美日韩成人一区| 夜夜嗨av一区二区三区四区| 亚洲一本视频| 国产精品一区二区在线观看网站 | 久久夜色精品国产噜噜av| 欧美成人久久| 在线视频你懂得一区| 国产精品久久一级| 欧美一区免费视频| 猛男gaygay欧美视频| 最近看过的日韩成人| 欧美日韩国产经典色站一区二区三区| 亚洲九九爱视频| 欧美伊人久久| 在线观看91久久久久久| 欧美黄色影院| 午夜亚洲伦理| 欧美大色视频| 亚洲一区国产一区| 国内精品模特av私拍在线观看| 久久综合五月| 国产精品99久久久久久有的能看| 久久国产精品亚洲va麻豆| 亚洲国产天堂久久综合| 欧美亚韩一区| 玖玖玖免费嫩草在线影院一区| 亚洲精品国产无天堂网2021| 欧美一区激情| 日韩视频专区| 国产亚洲综合在线| 欧美区亚洲区| 久久精品视频在线播放| 夜夜躁日日躁狠狠久久88av| 久久久久久欧美| 99国产精品私拍| 一区视频在线| 国产精品一区三区| 欧美国产日本| 久久国产精彩视频| 亚洲少妇中出一区| 亚洲福利在线观看| 久久久av水蜜桃| 亚洲性av在线| 99综合精品| 亚洲大片一区二区三区| 国产拍揄自揄精品视频麻豆| 欧美日韩在线视频一区| 欧美96在线丨欧| 久久久午夜电影| 欧美一级在线亚洲天堂| 99一区二区| 亚洲精品一区二区在线观看| 免费一级欧美片在线播放| 先锋亚洲精品| 亚洲小视频在线观看| 最近中文字幕mv在线一区二区三区四区| 国产日韩欧美三级| 国产精品区一区| 国产精品v片在线观看不卡 | 亚洲一区二区黄| 日韩一二在线观看| 亚洲激情视频| 亚洲欧洲一区二区在线播放| 免费久久99精品国产自在现线| 亚洲国产日韩一级| 亚洲天堂免费在线观看视频| 亚洲精品免费在线| 亚洲精品在线视频| 亚洲人成在线观看网站高清| 欧美激情视频在线免费观看 欧美视频免费一 | 久久精品国产在热久久| 午夜精品在线看| 香蕉成人伊视频在线观看 | 韩国女主播一区二区三区| 国产在线拍偷自揄拍精品| 国产婷婷精品| 国内精品久久久久久久影视麻豆 | 亚洲午夜精品久久| 99精品国产99久久久久久福利| 一区二区毛片| 欧美一区二区日韩| 久久精品官网| 欧美成人一二三| 亚洲精品国产精品国产自| 亚洲三级网站| 午夜国产精品视频| 久久精品一区二区三区不卡| 蘑菇福利视频一区播放| 欧美片在线观看| 国产美女精品人人做人人爽| 国产一区二区三区的电影 | 欧美成人精品在线| 亚洲国产成人久久| 9久草视频在线视频精品| 亚洲午夜免费视频| 久久久夜精品| 欧美日韩伦理在线免费| 国产伦精品一区二区三区四区免费 | 亚洲在线观看免费视频| 久久久久久亚洲精品不卡4k岛国| 欧美ed2k| 一本一本久久a久久精品综合麻豆| 亚洲欧美日韩国产一区二区三区 | 亚洲乱码日产精品bd| 午夜精品福利一区二区蜜股av| 欧美一级一区| 欧美日韩免费观看一区| 国内精品模特av私拍在线观看| 亚洲每日更新| 久久久精品免费视频| 亚洲精品久久久久中文字幕欢迎你| 亚洲私人影院| 欧美1区2区| 国产亚洲欧美一区二区| 亚洲美女毛片| 老司机精品导航| 亚洲国产精品久久久久婷婷老年 | 亚洲国产精品久久人人爱蜜臀| 亚洲综合精品一区二区| 欧美高清视频| 经典三级久久| 午夜精品久久久久久久99热浪潮| 欧美第一黄网免费网站| 亚洲乱码久久| 日韩视频免费观看| 欧美一级视频一区二区| 亚洲免费av电影| 欧美成人一区二区三区片免费| 国产亚洲一区精品|