# HG changeset patch # User Masataka Kohagura # Date 1451121212 -32400 # Node ID b8bc24abaf8a8e51584513c7d5c009bfbe842c71 # Parent 35608dc85e833a48322ad94e605cf4b5012383de add TODO and fix CharClassWalker diff -r 35608dc85e83 -r b8bc24abaf8a regexParser/TODO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/TODO Sat Dec 26 18:13:32 2015 +0900 @@ -0,0 +1,3 @@ +2015年 12月26日 土曜日 18時07分00秒 JST + TODO CharClassWalker のテストルーチンを作成する + TODO CharClassMerge のテストルーチンを作成する diff -r 35608dc85e83 -r b8bc24abaf8a regexParser/regexParser.h --- a/regexParser/regexParser.h Sat Dec 26 17:23:25 2015 +0900 +++ b/regexParser/regexParser.h Sat Dec 26 18:13:32 2015 +0900 @@ -86,6 +86,7 @@ typedef struct charClassWalker { CharClassStackPtr stack; + charClassStackState turn; CharClassPtr next; } CharClassWalker, *CharClassWalkerPtr; diff -r 35608dc85e83 -r b8bc24abaf8a regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Sat Dec 26 17:23:25 2015 +0900 +++ b/regexParser/subsetConstraction.cc Sat Dec 26 18:13:32 2015 +0900 @@ -117,11 +117,13 @@ while (next->left) { CharClassStackPtr ccs = NEW(CharClassStack); ccs->next = walk->stack; - ccs->turn = LEFT; + ccs->turn = walk->turn; + walk->turn = LEFT; ccs->cc = next; walk->stack = ccs; next = next->left; } + walk->turn = SELF; walk->next = next; } @@ -130,10 +132,6 @@ walk->next = NULL; walk->stack = NULL; if (!next) return walk; - if (!next->left) { - walk->next = next; - return walk; - } findLeftMost(next,walk); return walk; } @@ -143,36 +141,32 @@ } CharClassStackPtr charClassStackPop(CharClassWalkerPtr walk) { - if (!walk->stack) { - return NULL; - } CharClassStackPtr prev = walk->stack->next; free(walk->stack); walk->stack = prev; + walk->turn = prev->turn; return prev; } CharClassPtr getNext(CharClassWalkerPtr walk) { CharClassPtr current = walk->next; walk->next = NULL; - while (walk->stack) { - while (walk->stack->turn == RIGHT) { - if (charClassStackPop(walk) == NULL) { - return current; - } - } - if (walk->stack->turn == LEFT) { - walk->next = walk->stack->cc; - walk->stack->turn = SELF; - return current; - } + if (walk->turn == SELF) { if (current->right) { - walk->stack->turn = RIGHT; + walk->turn = RIGHT; findLeftMost(current->right,walk); return current; } + } + while (walk->stack) { + walk->next = walk->stack->cc; charClassStackPop(walk); - } + if (walk->turn == LEFT) { + walk->turn = SELF; + return current; + } + } + walk->next = NULL; return current; } @@ -229,7 +223,6 @@ TGValue stateAllocate(NodePtr n,TGValue tgv) { if (n->tokenType == '+') { TGValue tgvLeft = stateAllocate(n->left,tgv); - n->left->state = createState(tgvLeft,n->left); if (tgvLeft.asterisk) { TGValue tgvRight = tgvLeft; tgvRight.asterisk = false; @@ -340,12 +333,9 @@ printf("state : %lx\n",state->bitState.bitContainer); long nodeNumber = 0; if (state->node) { - if (state->node->nextState) { - printf("node : %c %lx -> %lx\n",state->node->tokenType, - state->bitState.bitContainer,state->node->nextState->bitState.bitContainer); + printf("node : %c %lx -> %d\n",state->node->tokenType,state->bitState.bitContainer,state->node->nextStateNum); if (state->node->state) nodeNumber = state->node->state->bitState.bitContainer; - } } if (state->cc) { printCharacterClass(state->cc,nodeNumber,4);