comparison 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
comparison
equal deleted inserted replaced
179:6cf8252f3912 180:d97bcab546e8
113 } 113 }
114 114
115 CharClassWalkerPtr findLeftMost(CharClassPtr next,CharClassWalkerPtr walk) { 115 CharClassWalkerPtr findLeftMost(CharClassPtr next,CharClassWalkerPtr walk) {
116 while (next->left) { 116 while (next->left) {
117 CharClassStackPtr ccs = NEW(CharClassStack); 117 CharClassStackPtr ccs = NEW(CharClassStack);
118 ccs->next = &walk->stack; 118 ccs->next = walk->stack;
119 ccs->left = false; 119 ccs->turn = LEFT;
120 ccs->cc = next; 120 ccs->cc = next;
121 walk->stack = *ccs; 121 walk->stack = ccs;
122 next = next->left; 122 next = next->left;
123 } 123 }
124 walk->next = next; 124 walk->next = next;
125 return walk; 125 return walk;
126 } 126 }
127 127
128 CharClassWalkerPtr createCharClassWalker (CharClassPtr next) { 128 CharClassWalkerPtr createCharClassWalker (CharClassPtr next) {
129 CharClassWalkerPtr walk = NEW(CharClassWalker); 129 CharClassWalkerPtr walk = NEW(CharClassWalker);
130 walk->next = NULL; 130 walk->next = NULL;
131 walk->stack = NULL;
131 if (!next) return walk; 132 if (!next) return walk;
132 if (!next->left) { 133 if (!next->left) {
133 walk->next = next; 134 walk->next = next;
134 return walk; 135 return walk;
135 } 136 }
139 140
140 bool hasNext(CharClassWalkerPtr walk) { 141 bool hasNext(CharClassWalkerPtr walk) {
141 return walk->next != NULL; 142 return walk->next != NULL;
142 } 143 }
143 144
145 CharClassStackPtr charClassStackPop(CharClassWalkerPtr walk) {
146 if (!walk->stack) {
147 return NULL;
148 }
149 CharClassStackPtr prev = walk->stack->next;
150 free(walk->stack);
151 walk->stack = prev;
152 return prev;
153 }
154
144 CharClassPtr getNext(CharClassWalkerPtr walk) { 155 CharClassPtr getNext(CharClassWalkerPtr walk) {
145 CharClassPtr current = walk->next; 156 CharClassPtr current = walk->next;
146 if (walk->next->left && current->right) { 157 walk->next = NULL;
147 walk->stack.left = true; 158 while (walk->stack) {
148 CharClassPtr next = findLeftMost(current->right,walk)->next; 159 while (walk->stack->turn == RIGHT) {
149 walk->next = next; 160 if (charClassStackPop(walk) == NULL) {
150 } else { 161 return current;
151 TransitionPtr tsOld = ts; 162 }
152 ts = ts->next; 163 }
153 free(tsOld); 164 if (walk->stack->turn == LEFT) {
154 CharClassPtr ret; 165 walk->next = walk->stack->cc;
155 if (ts) ret = ts->cc; 166 walk->stack->tuen == SELF;
156 else ret = NULL; 167 return current;
157 walk->next = ret; 168 }
169 if (current->right) {
170 walk->stack->turn = RIGHT;
171 walk->next = findLeftMost(current->right,walk);
172 return current;
173 }
174 charClassStackPop(walk);
158 } 175 }
159 return current; 176 return current;
160 } 177 }
161 178
162 CharClassPtr mergeTransition(StatePtr x,CharClassPtr y) { 179 CharClassPtr mergeTransition(StatePtr x,CharClassPtr y) {