# HG changeset patch # User Masataka Kohagura # Date 1451288522 -32400 # Node ID b0ae5273925cb00966bfba5c25568445f79a8291 # Parent bc596e357a52944bd46a8eb2fdda963d78266cce implement allocateCCState() diff -r bc596e357a52 -r b0ae5273925c regexParser/TODO --- a/regexParser/TODO Mon Dec 28 15:43:27 2015 +0900 +++ b/regexParser/TODO Mon Dec 28 16:42:02 2015 +0900 @@ -1,7 +1,7 @@ 2015年 12月26日 土曜日 18時07分00秒 JST TODO CharClassWalker の routine test を作成する TODO CharClassMerge の routine test を作成する - TODO serchBit の routine test を作成する + TODO searchBit の routine test を作成する TODO subsetConstraction の routine test を作成する 2015年 12月27日 日曜日 19時31分03秒 JST diff -r bc596e357a52 -r b0ae5273925c regexParser/node.cc --- a/regexParser/node.cc Mon Dec 28 15:43:27 2015 +0900 +++ b/regexParser/node.cc Mon Dec 28 16:42:02 2015 +0900 @@ -17,7 +17,7 @@ break; } } - printf("(%ld)\n",nodeNumber); + printf("(%d)\n",cc->stateNum); if (cc->right) { printCharacterClass(cc->right,nodeNumber,d+1); } diff -r bc596e357a52 -r b0ae5273925c regexParser/regexParser.cc --- a/regexParser/regexParser.cc Mon Dec 28 15:43:27 2015 +0900 +++ b/regexParser/regexParser.cc Mon Dec 28 16:42:02 2015 +0900 @@ -126,6 +126,8 @@ cc->nextState.bitContainer = 0; cc->left = NULL; cc->right = NULL; + cc->stateNum = 0; + cc->state = NULL; RangeListPtr rangeList = &cc->cond.range; rangeList->begin = *ri->ptr; rangeList->end = *ri->ptr; diff -r bc596e357a52 -r b0ae5273925c regexParser/regexParser.h --- a/regexParser/regexParser.h Mon Dec 28 15:43:27 2015 +0900 +++ b/regexParser/regexParser.h Mon Dec 28 16:42:02 2015 +0900 @@ -24,11 +24,15 @@ Word w; } Condition, *ConditionList; +struct state; + typedef struct charClass { unsigned char type; struct charClass *left; struct charClass *right; Condition cond; + int stateNum; + struct state *state; BitVector nextState; } CharClass, *CharClassPtr; diff -r bc596e357a52 -r b0ae5273925c regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Mon Dec 28 15:43:27 2015 +0900 +++ b/regexParser/subsetConstraction.cc Mon Dec 28 16:42:02 2015 +0900 @@ -195,6 +195,28 @@ bitvector を index とした配列に BitVectorPtr を格納 state に対応する NodePtr を */ +StatePtr createCCState(CharClassPtr cc,TGValue tgv) { + StatePtr s = NEW(State); + s->stateNum = cc->stateNum = ++tgv.tg->totalStateCount; + s->next = tgv.tg->stateList; + tgv.tg->stateList = s; + BitVector bi = createBitVector(cc->stateNum); + s->bitState = bi; + s->cc = cc; + return s; +} + +CharClassPtr allocateCCState(CharClassPtr cc, TGValue tgv) { + if (cc->left != NULL) { + allocateCCState(cc->left,tgv); + } + cc->state = createCCState(cc,tgv); + if (cc->right != NULL) { + allocateCCState(cc->right,tgv); + } + return cc; +} + StatePtr createState(TGValue tgv,NodePtr n) { StatePtr s = NEW(State); s->stateNum = n->stateNum = ++tgv.tg->totalStateCount; @@ -203,6 +225,9 @@ s->node = n; BitVector bi = createBitVector(n->stateNum); s->bitState = bi; + if (n->cc) { + CharClassPtr cc = allocateCCState(n->cc,tgv); + } s->cc = n->cc; return s; }