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;
 }