# HG changeset patch # User Masataka Kohagura # Date 1451126974 -32400 # Node ID 39ca25ed06078f8960c1316810231f1a125411a9 # Parent b8bc24abaf8a8e51584513c7d5c009bfbe842c71 add searchBit test diff -r b8bc24abaf8a -r 39ca25ed0607 regexParser/Makefile --- a/regexParser/Makefile Sat Dec 26 18:13:32 2015 +0900 +++ b/regexParser/Makefile Sat Dec 26 19:49:34 2015 +0900 @@ -15,6 +15,8 @@ $(TARGET):$(OBJS) $(CC) -o $@ $(OBJS) +test/searchBit: test/searchBit.cc + $(CC) -I. $< bitVector.cc -o $@ clean: rm -f $(TARGET) $(OBJS) diff -r b8bc24abaf8a -r 39ca25ed0607 regexParser/TODO --- a/regexParser/TODO Sat Dec 26 18:13:32 2015 +0900 +++ b/regexParser/TODO Sat Dec 26 19:49:34 2015 +0900 @@ -1,3 +1,4 @@ 2015年 12月26日 土曜日 18時07分00秒 JST TODO CharClassWalker のテストルーチンを作成する TODO CharClassMerge のテストルーチンを作成する + TODO serchBit のテストルーチンを作成する diff -r b8bc24abaf8a -r 39ca25ed0607 regexParser/bitVector.h --- a/regexParser/bitVector.h Sat Dec 26 18:13:32 2015 +0900 +++ b/regexParser/bitVector.h Sat Dec 26 19:49:34 2015 +0900 @@ -2,3 +2,7 @@ extern const BitVectorPtr allocateBitVector(); extern void bitSet(BitVectorPtr bi, int bitSetPosition); extern void bitPrint(BitVectorPtr bi); + +inline int searchBit(BitVector bi) { + return __builtin_ffs(bi.bitContainer); +} diff -r b8bc24abaf8a -r 39ca25ed0607 regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Sat Dec 26 18:13:32 2015 +0900 +++ b/regexParser/subsetConstraction.cc Sat Dec 26 19:49:34 2015 +0900 @@ -349,3 +349,58 @@ putchar('\n'); } } + +SCValue createSCValue(TGValue tgv) { + SCValue scv; + scv.stateTop = tgv.tg->stateList; + scv.stateEnd = scv.stateTop; + while (scv.stateEnd->next) { + scv.stateEnd = scv.stateEnd->next; + } + return; +} + +SCValue createState(SCValue scv,BitVector bi) { + StatePtr s = NEW(State); + s->stateNum = ++scv.tg->totalStateCount; + s->next = NULL; + scv.stateEnd->next = s; + scv.stateEnd = s; + s->bitState = bi; + s->cc = NULL; + return scv; +} + +/** + 現在のステートに含まれる組み合わせ状態をとってくる + 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する + 生成した状態は stateArray に格納するA + 新しい状態ができなくなったら終了 + + charClassMerge の段階で新しい状態をリストに登録したら、charclasswalk をする必要がなくなる + */ +SCValue subsetConstraction(SCValue scv) { + for (;scv.stateTop;scv.stateTop = scv.stateTop->next) { + CharClassWalker cw = createCharClassWalker(scv.stateTop->cc); + while (hasNext(cw)) { + CharClassPtr cc = getNext(cw); + unsigned long bi = cc->nextState.bitContainer; + if (scv.stateArray[bi]) continue; + scv = createState(scv,bi); + StatePtr s = scv.stateEnd; + for (;bi.bitContainer;) { + int bitPosition = searchBit(bi); + unsigned long baseNum = 1 << bitPosition; + bi.bitContainer ^= baseNum; + StatePtr base = scv.stateArray[baseNum]; + if (base == NULL) {// error + continue; + } + CharClassPtr merge = mergeTransition(s,base->cc); + s->cc = merge; + } + scv.stateArray[bi] = s; + } + } + return; +} diff -r b8bc24abaf8a -r 39ca25ed0607 regexParser/test/searchBit.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/test/searchBit.cc Sat Dec 26 19:49:34 2015 +0900 @@ -0,0 +1,14 @@ +#include +#include "regexParser.h" +#include "bitVector.h" + +int main () { + unsigned long x1 = 0x1000011; + BitVector bi = createBitVector(0); + bi.bitContainer = x1; + printf("%lx pos %d\n",bi.bitContainer,searchBit(bi)); + unsigned long x2 = 0x1000010; + bi.bitContainer = x2; + printf("%lx pos %d\n",bi.bitContainer,searchBit(bi)); + return 1; +}