comparison regexParser/subsetConstruction.cc @ 220:4dc8d327cc7d

subset construction worked how to handle EOF?
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 02 Jan 2016 00:01:22 +0900
parents d10fa72d8f31
children c38a7b2dd996
comparison
equal deleted inserted replaced
219:a8e477f1352d 220:4dc8d327cc7d
333 } 333 }
334 } 334 }
335 335
336 SCValue createSCValue(TGValue tgv) { 336 SCValue createSCValue(TGValue tgv) {
337 SCValue scv; 337 SCValue scv;
338 scv.tg = tgv.tg;
338 scv.stateTop = tgv.tg->stateList; 339 scv.stateTop = tgv.tg->stateList;
339 scv.stateEnd = scv.stateTop; 340 scv.stateEnd = scv.stateTop;
340 while (scv.stateEnd->next) { 341 while (scv.stateEnd->next) {
341 scv.stateEnd = scv.stateEnd->next; 342 scv.stateEnd = scv.stateEnd->next;
342 } 343 }
366 for (;scv.stateTop;scv.stateTop = scv.stateTop->next) { 367 for (;scv.stateTop;scv.stateTop = scv.stateTop->next) {
367 CharClassWalkerPtr cw = createCharClassWalker(scv.stateTop->cc); 368 CharClassWalkerPtr cw = createCharClassWalker(scv.stateTop->cc);
368 while (hasNext(cw)) { 369 while (hasNext(cw)) {
369 CharClassPtr cc = getNext(cw); 370 CharClassPtr cc = getNext(cw);
370 BitVector bi = cc->nextState; 371 BitVector bi = cc->nextState;
371 if (scv.stateArray[bi.bitContainer]) continue; 372 if (scv.tg->stateArray[bi.bitContainer]) continue; // already done
372 scv = createState(scv,bi); 373 scv = createState(scv,bi);
373 StatePtr s = scv.stateEnd; 374 StatePtr s = scv.stateEnd;
374 for (;bi.bitContainer;) { 375 scv.tg->stateArray[bi.bitContainer] = s;
376 for (;;) {
375 int bitPosition = searchBit(bi); 377 int bitPosition = searchBit(bi);
376 unsigned long baseNum = 1 << bitPosition; 378 if (!bitPosition) break;
379 unsigned long baseNum = 1 << (bitPosition-1);
380 // printf("bit %lx pos %d baseNum %lx\n",bi.bitContainer,bitPosition,baseNum);
377 bi.bitContainer ^= baseNum; 381 bi.bitContainer ^= baseNum;
378 StatePtr base = scv.stateArray[baseNum]; 382 if (baseNum==2) continue; // EOF case
379 if (base == NULL) {// error 383 StatePtr base = scv.tg->stateArray[baseNum];
380 continue; 384 if (base == NULL) {
385 errorMassege("No base state",__LINE__,__FILE__); break;
381 } 386 }
382 CharClassPtr merge = mergeTransition(s,base->cc); 387 CharClassPtr merge = mergeTransition(s,base->cc);
383 s->cc = merge; 388 s->cc = merge;
384 } 389 }
385 scv.stateArray[bi.bitContainer] = s;
386 } 390 }
387 } 391 }
388 return scv; 392 return scv;
389 } 393 }