Mercurial > hg > Applications > Grep
comparison regexParser/subsetConstruction.cc @ 248:2b1fbfb92d54
implement tSearch
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 22 Jan 2016 20:09:42 +0900 |
parents | a3cddb32b87f |
children | e60dd2fa3409 |
comparison
equal
deleted
inserted
replaced
247:96c2507fd22d | 248:2b1fbfb92d54 |
---|---|
162 } | 162 } |
163 return current; | 163 return current; |
164 } | 164 } |
165 | 165 |
166 void setState(CharClassPtr cc, BitVector bi) { | 166 void setState(CharClassPtr cc, BitVector bi) { |
167 // if (word case) setNext(bitVector to the word list) | |
167 cc->nextState = bi; | 168 cc->nextState = bi; |
168 if (cc->left) { | 169 if (cc->left) { |
169 setState(cc->left,bi); | 170 setState(cc->left,bi); |
170 } | 171 } |
171 cc->nextState = bi; | 172 cc->nextState = bi; |
196 作成する state を linked list | 197 作成する state を linked list |
197 bitvector を index とした配列に BitVectorPtr を格納 | 198 bitvector を index とした配列に BitVectorPtr を格納 |
198 state に対応する NodePtr を | 199 state に対応する NodePtr を |
199 */ | 200 */ |
200 StatePtr createState(TGValue tgv,NodePtr n) { | 201 StatePtr createState(TGValue tgv,NodePtr n) { |
201 StatePtr s = NEW(State); | 202 BitVector bi = createBitVector(tgv.tg->totalStateCount); |
202 s->stateNum = n->stateNum = tgv.tg->totalStateCount; | 203 StatePtr s = createState(tgv.tg,bi); |
204 n->stateNum = s->stateNum; | |
203 s->next = tgv.tg->stateList; | 205 s->next = tgv.tg->stateList; |
204 tgv.tg->stateList = s; | 206 tgv.tg->stateList = s; |
205 s->node = n; | 207 s->node = n; |
206 BitVector bi = createBitVector(n->stateNum); | |
207 s->bitState = bi; | 208 s->bitState = bi; |
208 s->accept = false; | 209 s->accept = false; |
209 tgv.tg->totalStateCount++; | |
210 s->cc = n->cc; | 210 s->cc = n->cc; |
211 return s; | 211 return s; |
212 } | |
213 | |
214 SCValue createState(TransitionGeneratorPtr tg,BitVector bi) { | |
215 StatePtr s = NEW(State); | |
216 s->stateNum = tg->totalStateCount++; | |
217 s->next = NULL; | |
218 tg->stateEnd->next = s; | |
219 tg->stateEnd = s; | |
220 s->bitState = bi; | |
221 s->cc = NULL; | |
222 s->node = NULL; | |
223 return scv; | |
212 } | 224 } |
213 | 225 |
214 /** | 226 /** |
215 pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る | 227 pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る |
216 前が * でない + は新しく状態を作る | 228 前が * でない + は新しく状態を作る |
349 scv.stateEnd = scv.stateEnd->next; | 361 scv.stateEnd = scv.stateEnd->next; |
350 } | 362 } |
351 return scv; | 363 return scv; |
352 } | 364 } |
353 | 365 |
354 SCValue createState(SCValue scv,BitVector bi) { | |
355 StatePtr s = NEW(State); | |
356 s->stateNum = ++scv.tg->totalStateCount; | |
357 s->next = NULL; | |
358 scv.stateEnd->next = s; | |
359 scv.stateEnd = s; | |
360 s->bitState = bi; | |
361 s->cc = NULL; | |
362 s->node = NULL; | |
363 return scv; | |
364 } | |
365 | |
366 /** | 366 /** |
367 現在のステートに含まれる組み合わせ状態をとってくる | 367 現在のステートに含まれる組み合わせ状態をとってくる |
368 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する | 368 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する |
369 生成した状態は stateArray に格納するA | 369 生成した状態は stateArray に格納するA |
370 新しい状態ができなくなったら終了 | 370 新しい状態ができなくなったら終了 |
371 | 371 |
372 charClassMerge の段階で新しい状態をリストに登録したら、charclasswalk をする必要がなくなる | 372 charClassMerge の段階で新しい状態をリストに登録したら、charclasswalk をする必要がなくなる |
373 */ | 373 */ |
374 SCValue subsetConstruction(SCValue scv) { | 374 void determinize(StatePtr s, TransitionGeneratorPtr tg) { |
375 for (;scv.stateTop;scv.stateTop = scv.stateTop->next) { | 375 BitVector bi = s->bitState; |
376 CharClassWalkerPtr cw = createCharClassWalker(scv.stateTop->cc); | 376 for (;;) { |
377 int bitPosition = searchBit(bi); | |
378 if (!bitPosition) break; | |
379 unsigned long baseNum = 1 << (bitPosition-1); | |
380 // printf("bit %lx pos %d baseNum %lx\n",bi.bitContainer,bitPosition,baseNum); | |
381 bi.bitContainer ^= baseNum; | |
382 if (baseNum==2) continue; // EOF case | |
383 StatePtr base = tg->stateArray[baseNum]; | |
384 if (base == NULL) { | |
385 errorMassege("No base state",__LINE__,__FILE__); break; | |
386 } | |
387 CharClassPtr merge = mergeTransition(s,base->cc); | |
388 s->cc = merge; | |
389 } | |
390 } | |
391 | |
392 void subsetConstruction(TransitionGeneratorPtr tg) { | |
393 for (;tg->stateTop;tg->stateTop = tg->stateTop->next) { | |
394 CharClassWalkerPtr cw = createCharClassWalker(state->cc); | |
377 while (hasNext(cw)) { | 395 while (hasNext(cw)) { |
378 CharClassPtr cc = getNext(cw); | 396 CharClassPtr cc = getNext(cw); |
379 BitVector bi = cc->nextState; | 397 BitVector bi = cc->nextState; |
380 if (scv.tg->stateArray[bi.bitContainer]) continue; // already done | 398 if (tg->stateArray[bi.bitContainer]) continue; // already done |
381 scv = createState(scv,bi); | 399 StatePtr s = createState(tg,bi); |
382 StatePtr s = scv.stateEnd; | 400 tg->stateArray[bi.bitContainer] = s; |
383 scv.tg->stateArray[bi.bitContainer] = s; | 401 determinize(s,tg); |
384 for (;;) { | |
385 int bitPosition = searchBit(bi); | |
386 if (!bitPosition) break; | |
387 unsigned long baseNum = 1 << (bitPosition-1); | |
388 // printf("bit %lx pos %d baseNum %lx\n",bi.bitContainer,bitPosition,baseNum); | |
389 bi.bitContainer ^= baseNum; | |
390 if (baseNum==2) continue; // EOF case | |
391 StatePtr base = scv.tg->stateArray[baseNum]; | |
392 if (base == NULL) { | |
393 errorMassege("No base state",__LINE__,__FILE__); break; | |
394 } | |
395 CharClassPtr merge = mergeTransition(s,base->cc); | |
396 s->cc = merge; | |
397 } | |
398 } | 402 } |
399 free(cw); | 403 free(cw); |
400 } | 404 } |
401 return scv; | 405 } |
402 } |