Mercurial > hg > Applications > Grep
diff regexParser/subsetConstraction.cc @ 180:d97bcab546e8 pairPro
implement getNext
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 24 Dec 2015 17:56:28 +0900 |
parents | 5e8c6857934c |
children | 3c4db09b8581 |
line wrap: on
line diff
--- a/regexParser/subsetConstraction.cc Wed Dec 23 19:44:48 2015 +0900 +++ b/regexParser/subsetConstraction.cc Thu Dec 24 17:56:28 2015 +0900 @@ -115,10 +115,10 @@ CharClassWalkerPtr findLeftMost(CharClassPtr next,CharClassWalkerPtr walk) { while (next->left) { CharClassStackPtr ccs = NEW(CharClassStack); - ccs->next = &walk->stack; - ccs->left = false; + ccs->next = walk->stack; + ccs->turn = LEFT; ccs->cc = next; - walk->stack = *ccs; + walk->stack = ccs; next = next->left; } walk->next = next; @@ -128,6 +128,7 @@ CharClassWalkerPtr createCharClassWalker (CharClassPtr next) { CharClassWalkerPtr walk = NEW(CharClassWalker); walk->next = NULL; + walk->stack = NULL; if (!next) return walk; if (!next->left) { walk->next = next; @@ -141,20 +142,36 @@ return walk->next != NULL; } +CharClassStackPtr charClassStackPop(CharClassWalkerPtr walk) { + if (!walk->stack) { + return NULL; + } + CharClassStackPtr prev = walk->stack->next; + free(walk->stack); + walk->stack = prev; + return prev; +} + CharClassPtr getNext(CharClassWalkerPtr walk) { CharClassPtr current = walk->next; - if (walk->next->left && current->right) { - walk->stack.left = true; - CharClassPtr next = findLeftMost(current->right,walk)->next; - walk->next = next; - } else { - TransitionPtr tsOld = ts; - ts = ts->next; - free(tsOld); - CharClassPtr ret; - if (ts) ret = ts->cc; - else ret = NULL; - walk->next = ret; + 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->tuen == SELF; + return current; + } + if (current->right) { + walk->stack->turn = RIGHT; + walk->next = findLeftMost(current->right,walk); + return current; + } + charClassStackPop(walk); } return current; }