Mercurial > hg > Applications > Grep
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 } |