comparison regexParser/subsetConstraction.cc @ 187:ef798db705e9 pairPro

remove some warnings and errors(not working)
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Thu, 24 Dec 2015 22:38:50 +0900
parents 3e8aae8beba9
children 109d22faf7b5
comparison
equal deleted inserted replaced
186:3e8aae8beba9 187:ef798db705e9
184 if (cc->right) { 184 if (cc->right) {
185 setState(cc->right,bi); 185 setState(cc->right,bi);
186 } 186 }
187 } 187 }
188 188
189 CharClassPtr mergeTransition(StatePtr x,CharClassPtr y) { 189 CharClassPtr mergeTransition(node::StatePtr x,CharClassPtr y) {
190 if (x->cc == NULL) { 190 if (x->cc == NULL) {
191 return y; 191 return y;
192 } 192 }
193 CharClassWalkerPtr walk = createCharClassWalker(x->cc); 193 CharClassWalkerPtr walk = createCharClassWalker(x->cc);
194 CharClassPtr ccy = y; 194 CharClassPtr ccy = y;
206 /** 206 /**
207 作成する state を linked list 207 作成する state を linked list
208 bitvector を index とした配列に BitVectorPtr を格納 208 bitvector を index とした配列に BitVectorPtr を格納
209 state に対応する NodePtr を 209 state に対応する NodePtr を
210 */ 210 */
211 TGValue createState(TGValue tg,NodePtr n) { 211 node::StatePtr createState(TGValue tg,NodePtr n) {
212 StatePtr s = NEW(State); 212 node::StatePtr s = NEW(node::State);
213 s->next = tg.tg->currentState; 213 s->next = tg.tg->currentState;
214 tg.tg->currentState = s; 214 tg.tg->currentState = s;
215 s->node = n; 215 s->node = n;
216 BitVector bi = createBitVector(tg.stateBegin); 216 BitVector bi = createBitVector(n->stateNum);
217 s->bitState = bi; 217 s->bitState = bi;
218 s->cc = NULL; 218 s->cc = NULL;
219 return s;
219 } 220 }
220 221
221 /** 222 /**
222 正規表現に必要な状態を探して、それぞれに番号を割り振る 223 正規表現に必要な状態を探して、それぞれに番号を割り振る
223 前が * でない + は新しく状態を作る 224 前が * でない + は新しく状態を作る
271 tgRight.asterisk = false; 272 tgRight.asterisk = false;
272 tgRight = generateTransition(n->right,tgRight); 273 tgRight = generateTransition(n->right,tgRight);
273 tgRight.asterisk = true; 274 tgRight.asterisk = true;
274 return tgRight; 275 return tgRight;
275 } 276 }
276 StatePtr left = tg.state; 277 node::StatePtr left = tg.tgState;
277 tg.state = n->left->state; 278 tg.tgState = n->left->state;
278 tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state; 279 // tg.tg->stateArray[tg.tgState->bitState.bitContainer] = tg.tgState;
279 TGValue tgLeft = generateTransition(n->left,tg); 280 TGValue tgLeft = generateTransition(n->left,tg);
280 tg.state = left; 281 tg.tgState = left;
281 TGValue tgv1 = generateTransition(n->right,tgLeft); 282 TGValue tgv1 = generateTransition(n->right,tgLeft);
282 return tgv1; 283 return tgv1;
283 } else if (n->tokenType == '|') { 284 } else if (n->tokenType == '|') {
284 TGValue tgv = generateTransition(n->left,tg); 285 TGValue tgv = generateTransition(n->left,tg);
285 TGValue tgv1 = generateTransition(n->right,tgv); 286 TGValue tgv1 = generateTransition(n->right,tgv);
286 return tgv1; 287 return tgv1;
287 } else if (n->tokenType == '*') { 288 } else if (n->tokenType == '*') {
288 tgAstah = generateTransition(n->left,tgAstah); 289 TGValue tgAstah = generateTransition(n->left,tg);
289 tgAstah.asterisk = true; 290 tgAstah.asterisk = true;
290 return tgAstah; 291 return tgAstah;
291 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ 292 } else if (n->tokenType == 'c' || n->tokenType == 'a'){
292 TGValue tgv = tg; 293 TGValue tgv = tg;
293 tgv.asterisk = false; 294 tgv.asterisk = false;
294 BitVector bi = createBitVector(n->nextStateNum); 295 BitVector bi = createBitVector(n->nextStateNum);
295 setState(n->cc,bi); 296 setState(n->cc,bi);
296 tgv.state->cc = mergeTransition(tgv.state,n->cc); 297 tgv.tgState->cc = mergeTransition(tgv.tgState,n->cc);
297 return tgv; 298 return tgv;
298 } else { 299 } else {
299 return tg; 300 return tg;
300 }
301 }
302
303 void printTransitionList(TransitionPtr ts) {
304 for (;ts;ts = ts->next) {
305 printf("\n");
306 } 301 }
307 } 302 }
308 303
309 TransitionGeneratorPtr createTransitionGenerator() { 304 TransitionGeneratorPtr createTransitionGenerator() {
310 TransitionGeneratorPtr tg = NEW(TransitionGenerator); 305 TransitionGeneratorPtr tg = NEW(TransitionGenerator);
311 tg->stateMax = 0; 306 tg->stateMax = 0;
312 tg->stack = NULL; 307 tg->stack = NULL;
313 tg->state = NEW(State); 308 tg->state = NEW(node::State);
314 tg->stateArray = NULL; 309 tg->stateArray = NULL;
315 tg->currentState = NULL; 310 tg->currentState = NULL;
316 return tg; 311 return tg;
317 } 312 }
318 313
319 TransitionGenerator generateTransitionList(NodePtr n) { 314 TransitionGeneratorPtr generateTransitionList(NodePtr n) {
320 TransitionGeneratorPtr tg = createTransitionGenerator(); 315 TransitionGeneratorPtr tg = createTransitionGenerator();
321 TGValue tgv; 316 TGValue tgv;
322 tgv.asterisk = false; 317 tgv.asterisk = false;
323 tgv.tg = tg; 318 tgv.tg = tg;
324 StatePtr start = createState(tgv,n); 319 node::StatePtr start = createState(tgv,n);
325 NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL); 320 NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL);
326 StatePtr end = createState(tgv,eof); 321 node::StatePtr end = createState(tgv,eof);
327 tgv.stateBegin = 0; 322 tgv.stateBegin = 0;
328 tgv.stateEnd = 1; 323 tgv.stateEnd = 1;
329 stateAllocate(n,tgv); 324 stateAllocate(n,tgv);
330 tgv.tg->stateMax = tg.stateNum; 325 tgv.tg->stateMax = tg->stateMax;
331 tgv.tg.stateArray = (StatePtr)calloc(tg.stateNum,sizeof(StatePtr)); 326 tgv.tg->stateArray = (node::StatePtr)calloc(tg->stateMax,sizeof(node::StatePtr));
332 generateTransition(n,tgv); 327 generateTransition(n,tgv);
333 printTransitionList(tg.ts);
334 return tg; 328 return tg;
335 } 329 }