comparison regexParser/subsetConstraction.cc @ 214:a94f57af1600

remove allocateCCstate createCCState
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Mon, 28 Dec 2015 20:32:36 +0900
parents 11b6332f0a42
children 63e9224c7b2b
comparison
equal deleted inserted replaced
213:11b6332f0a42 214:a94f57af1600
193 /** 193 /**
194 作成する state を linked list 194 作成する state を linked list
195 bitvector を index とした配列に BitVectorPtr を格納 195 bitvector を index とした配列に BitVectorPtr を格納
196 state に対応する NodePtr を 196 state に対応する NodePtr を
197 */ 197 */
198 StatePtr createCCState(CharClassPtr cc,TGValue tgv) {
199 StatePtr s = NEW(State);
200 s->stateNum = cc->stateNum = ++tgv.tg->totalStateCount;
201 s->next = tgv.tg->stateList;
202 tgv.tg->stateList = s;
203 BitVector bi = createBitVector(cc->stateNum);
204 s->bitState = bi;
205 s->cc = cc;
206 return s;
207 }
208
209 CharClassPtr allocateCCState(CharClassPtr cc, TGValue tgv) {
210 if (cc->left) {
211 allocateCCState(cc->left,tgv);
212 }
213 cc->state = createCCState(cc,tgv);
214 if (cc->right) {
215 allocateCCState(cc->right,tgv);
216 }
217 return cc;
218 }
219
220 StatePtr createState(TGValue tgv,NodePtr n) { 198 StatePtr createState(TGValue tgv,NodePtr n) {
221 StatePtr s = NEW(State); 199 StatePtr s = NEW(State);
222 s->stateNum = n->stateNum = tgv.tg->totalStateCount; 200 s->stateNum = n->stateNum = tgv.tg->totalStateCount;
223 s->next = tgv.tg->stateList; 201 s->next = tgv.tg->stateList;
224 tgv.tg->stateList = s; 202 tgv.tg->stateList = s;
225 s->node = n; 203 s->node = n;
226 BitVector bi = createBitVector(n->stateNum); 204 BitVector bi = createBitVector(n->stateNum);
227 s->bitState = bi; 205 s->bitState = bi;
228 if (n->cc) { 206 tgv.tg->totalStateCount++;
229 allocateCCState(n->cc,tgv);
230 } else {
231 tgv.tg->totalStateCount++;
232 }
233 s->cc = n->cc; 207 s->cc = n->cc;
234 return s; 208 return s;
235 } 209 }
236 210
237 /** 211 /**
250 return tgvRight; 224 return tgvRight;
251 } 225 }
252 TGValue tgvRight = tgvLeft; 226 TGValue tgvRight = tgvLeft;
253 n->right->state = createState(tgvRight,n->right); 227 n->right->state = createState(tgvRight,n->right);
254 tgvRight.startState = n->right->state; 228 tgvRight.startState = n->right->state;
255 stateAllocate(n->right,tgvRight); 229 tgvRight.asterisk = false;
256 return tgvLeft; 230 tgvRight = stateAllocate(n->right,tgvRight);
231 return tgvRight;
257 } else if (n->tokenType == '|') { 232 } else if (n->tokenType == '|') {
258 TGValue tgv1 = stateAllocate(n->left,tgv); 233 TGValue tgv1 = stateAllocate(n->left,tgv);
259 TGValue tgv2 = stateAllocate(n->right,tgv1); 234 TGValue tgv2 = stateAllocate(n->right,tgv1);
260 return tgv2; 235 return tgv2;
261 } else if (n->tokenType == '*') { 236 } else if (n->tokenType == '*') {
290 tgvRight.asterisk = false; 265 tgvRight.asterisk = false;
291 tgvRight = generateTransition(n->right,tgvRight); 266 tgvRight = generateTransition(n->right,tgvRight);
292 tgvRight.asterisk = true; 267 tgvRight.asterisk = true;
293 return tgvRight; 268 return tgvRight;
294 } 269 }
270 TGValue tgvRight = tgvLeft;
295 StatePtr left = tgvLeft.startState; 271 StatePtr left = tgvLeft.startState;
296 tgvLeft.startState = n->right->state; 272 tgvLeft.startState = n->right->state;
297 tgvLeft.tg->stateArray[tgvLeft.startState->bitState.bitContainer] = left; 273 tgvLeft.tg->stateArray[tgvLeft.startState->bitState.bitContainer] = left;
298 TGValue tgv1 = generateTransition(n->right,tgvLeft); 274 tgvRight.asterisk = false;
299 tgv1.startState = left; 275 tgvRight = generateTransition(n->right,tgvRight);
300 return tgv1; 276 return tgvRight;
301 } else if (n->tokenType == '|') { 277 } else if (n->tokenType == '|') {
302 TGValue tgv1 = generateTransition(n->left,tgv); 278 TGValue tgv1 = generateTransition(n->left,tgv);
303 TGValue tgv2 = generateTransition(n->right,tgv1); 279 TGValue tgv2 = generateTransition(n->right,tgv1);
304 return tgv2; 280 return tgv2;
305 } else if (n->tokenType == '*') { 281 } else if (n->tokenType == '*') {