# HG changeset patch # User Masataka Kohagura # Date 1451120967 -32400 # Node ID 98ff9d94566afd89a3951fe479dec73534341f5c # Parent 63a98405aafa0671c16da4ddc35be0c5592851c9 fix CharClassWalker diff -r 63a98405aafa -r 98ff9d94566a regexParser/TODO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/TODO Sat Dec 26 18:09:27 2015 +0900 @@ -0,0 +1,3 @@ +2015年 12月26日 土曜日 18時07分00秒 JST + TODO CharClassWalker のテストルーチンを作成する + TODO CharClassMerge のテストルーチンを作成する diff -r 63a98405aafa -r 98ff9d94566a regexParser/regexParser.h --- a/regexParser/regexParser.h Sat Dec 26 14:05:14 2015 +0900 +++ b/regexParser/regexParser.h Sat Dec 26 18:09:27 2015 +0900 @@ -86,6 +86,7 @@ typedef struct charClassWalker { CharClassStackPtr stack; + charClassStackState turn; CharClassPtr next; } CharClassWalker, *CharClassWalkerPtr; diff -r 63a98405aafa -r 98ff9d94566a regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Sat Dec 26 14:05:14 2015 +0900 +++ b/regexParser/subsetConstraction.cc Sat Dec 26 18:09:27 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; }