comparison regexParser/subsetConstruction.cc @ 250:e60dd2fa3409

remove SCValue
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Sat, 23 Jan 2016 13:51:33 +0900
parents 2b1fbfb92d54
children 21b9ba76f91b
comparison
equal deleted inserted replaced
249:9493800265a8 250:e60dd2fa3409
196 /** 196 /**
197 作成する state を linked list 197 作成する state を linked list
198 bitvector を index とした配列に BitVectorPtr を格納 198 bitvector を index とした配列に BitVectorPtr を格納
199 state に対応する NodePtr を 199 state に対応する NodePtr を
200 */ 200 */
201 StatePtr createState(TransitionGeneratorPtr tg,BitVector bi) {
202 StatePtr s = NEW(State);
203 s->stateNum = tg->totalStateCount++;
204 s->next = NULL;
205 tg->stateEnd->next = s;
206 tg->stateEnd = s;
207 s->bitState = bi;
208 s->cc = NULL;
209 s->node = NULL;
210 return s;
211 }
212
201 StatePtr createState(TGValue tgv,NodePtr n) { 213 StatePtr createState(TGValue tgv,NodePtr n) {
202 BitVector bi = createBitVector(tgv.tg->totalStateCount); 214 BitVector bi = createBitVector(tgv.tg->totalStateCount);
203 StatePtr s = createState(tgv.tg,bi); 215 StatePtr s = createState(tgv.tg,bi);
204 n->stateNum = s->stateNum; 216 n->stateNum = s->stateNum;
205 s->next = tgv.tg->stateList; 217 s->next = tgv.tg->stateList;
207 s->node = n; 219 s->node = n;
208 s->bitState = bi; 220 s->bitState = bi;
209 s->accept = false; 221 s->accept = false;
210 s->cc = n->cc; 222 s->cc = n->cc;
211 return s; 223 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;
224 } 224 }
225 225
226 /** 226 /**
227 pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る 227 pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る
228 前が * でない + は新しく状態を作る 228 前が * でない + は新しく状態を作る
350 printState(state); 350 printState(state);
351 putchar('\n'); 351 putchar('\n');
352 } 352 }
353 } 353 }
354 354
355 SCValue createSCValue(TGValue tgv) {
356 SCValue scv;
357 scv.tg = tgv.tg;
358 scv.stateTop = tgv.tg->stateList;
359 scv.stateEnd = scv.stateTop;
360 while (scv.stateEnd->next) {
361 scv.stateEnd = scv.stateEnd->next;
362 }
363 return scv;
364 }
365
366 /** 355 /**
367 現在のステートに含まれる組み合わせ状態をとってくる 356 現在のステートに含まれる組み合わせ状態をとってくる
368 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する 357 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する
369 生成した状態は stateArray に格納するA 358 生成した状態は stateArray に格納するA
370 新しい状態ができなくなったら終了 359 新しい状態ができなくなったら終了
389 } 378 }
390 } 379 }
391 380
392 void subsetConstruction(TransitionGeneratorPtr tg) { 381 void subsetConstruction(TransitionGeneratorPtr tg) {
393 for (;tg->stateTop;tg->stateTop = tg->stateTop->next) { 382 for (;tg->stateTop;tg->stateTop = tg->stateTop->next) {
394 CharClassWalkerPtr cw = createCharClassWalker(state->cc); 383 CharClassWalkerPtr cw = createCharClassWalker(tg->stateTop->cc);
395 while (hasNext(cw)) { 384 while (hasNext(cw)) {
396 CharClassPtr cc = getNext(cw); 385 CharClassPtr cc = getNext(cw);
397 BitVector bi = cc->nextState; 386 BitVector bi = cc->nextState;
398 if (tg->stateArray[bi.bitContainer]) continue; // already done 387 if (tg->stateArray[bi.bitContainer]) continue; // already done
399 StatePtr s = createState(tg,bi); 388 StatePtr s = createState(tg,bi);