comparison regexParser/subsetConstraction.cc @ 199:98ff9d94566a pairPro

fix CharClassWalker
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Sat, 26 Dec 2015 18:09:27 +0900
parents 4fefd80c05f2
children
comparison
equal deleted inserted replaced
197:63a98405aafa 199:98ff9d94566a
115 115
116 void findLeftMost(CharClassPtr next,CharClassWalkerPtr walk) { 116 void findLeftMost(CharClassPtr next,CharClassWalkerPtr walk) {
117 while (next->left) { 117 while (next->left) {
118 CharClassStackPtr ccs = NEW(CharClassStack); 118 CharClassStackPtr ccs = NEW(CharClassStack);
119 ccs->next = walk->stack; 119 ccs->next = walk->stack;
120 ccs->turn = LEFT; 120 ccs->turn = walk->turn;
121 walk->turn = LEFT;
121 ccs->cc = next; 122 ccs->cc = next;
122 walk->stack = ccs; 123 walk->stack = ccs;
123 next = next->left; 124 next = next->left;
124 } 125 }
126 walk->turn = SELF;
125 walk->next = next; 127 walk->next = next;
126 } 128 }
127 129
128 CharClassWalkerPtr createCharClassWalker (CharClassPtr next) { 130 CharClassWalkerPtr createCharClassWalker (CharClassPtr next) {
129 CharClassWalkerPtr walk = NEW(CharClassWalker); 131 CharClassWalkerPtr walk = NEW(CharClassWalker);
130 walk->next = NULL; 132 walk->next = NULL;
131 walk->stack = NULL; 133 walk->stack = NULL;
132 if (!next) return walk; 134 if (!next) return walk;
133 if (!next->left) {
134 walk->next = next;
135 return walk;
136 }
137 findLeftMost(next,walk); 135 findLeftMost(next,walk);
138 return walk; 136 return walk;
139 } 137 }
140 138
141 bool hasNext(CharClassWalkerPtr walk) { 139 bool hasNext(CharClassWalkerPtr walk) {
142 return walk->next != NULL; 140 return walk->next != NULL;
143 } 141 }
144 142
145 CharClassStackPtr charClassStackPop(CharClassWalkerPtr walk) { 143 CharClassStackPtr charClassStackPop(CharClassWalkerPtr walk) {
146 if (!walk->stack) {
147 return NULL;
148 }
149 CharClassStackPtr prev = walk->stack->next; 144 CharClassStackPtr prev = walk->stack->next;
150 free(walk->stack); 145 free(walk->stack);
151 walk->stack = prev; 146 walk->stack = prev;
147 walk->turn = prev->turn;
152 return prev; 148 return prev;
153 } 149 }
154 150
155 CharClassPtr getNext(CharClassWalkerPtr walk) { 151 CharClassPtr getNext(CharClassWalkerPtr walk) {
156 CharClassPtr current = walk->next; 152 CharClassPtr current = walk->next;
157 walk->next = NULL; 153 walk->next = NULL;
158 while (walk->stack) { 154 if (walk->turn == SELF) {
159 while (walk->stack->turn == RIGHT) {
160 if (charClassStackPop(walk) == NULL) {
161 return current;
162 }
163 }
164 if (walk->stack->turn == LEFT) {
165 walk->next = walk->stack->cc;
166 walk->stack->turn = SELF;
167 return current;
168 }
169 if (current->right) { 155 if (current->right) {
170 walk->stack->turn = RIGHT; 156 walk->turn = RIGHT;
171 findLeftMost(current->right,walk); 157 findLeftMost(current->right,walk);
172 return current; 158 return current;
173 } 159 }
160 }
161 while (walk->stack) {
162 walk->next = walk->stack->cc;
174 charClassStackPop(walk); 163 charClassStackPop(walk);
175 } 164 if (walk->turn == LEFT) {
165 walk->turn = SELF;
166 return current;
167 }
168 }
169 walk->next = NULL;
176 return current; 170 return current;
177 } 171 }
178 172
179 void setState(CharClassPtr cc, BitVector bi) { 173 void setState(CharClassPtr cc, BitVector bi) {
180 cc->nextState = bi; 174 cc->nextState = bi;