Mercurial > hg > Applications > Grep
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) { |