comparison regexParser/subsetConstruction.cc @ 239:f5931151d70c

add accept flag
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Wed, 20 Jan 2016 18:05:19 +0900
parents 5d66672e5029
children 87ad91af8a15
comparison
equal deleted inserted replaced
238:5d66672e5029 239:f5931151d70c
202 s->next = tgv.tg->stateList; 202 s->next = tgv.tg->stateList;
203 tgv.tg->stateList = s; 203 tgv.tg->stateList = s;
204 s->node = n; 204 s->node = n;
205 BitVector bi = createBitVector(n->stateNum); 205 BitVector bi = createBitVector(n->stateNum);
206 s->bitState = bi; 206 s->bitState = bi;
207 s->accept = false;
207 tgv.tg->totalStateCount++; 208 tgv.tg->totalStateCount++;
208 s->cc = n->cc; 209 s->cc = n->cc;
209 return s; 210 return s;
210 } 211 }
211 212
249 TGValue tgv2 = generateTransition(n->right,tgv1,pass); 250 TGValue tgv2 = generateTransition(n->right,tgv1,pass);
250 return tgv2; 251 return tgv2;
251 } else if (n->tokenType == '*') { 252 } else if (n->tokenType == '*') {
252 TGValue tgvAstah = tgv; 253 TGValue tgvAstah = tgv;
253 tgvAstah.endState = tgvAstah.startState; 254 tgvAstah.endState = tgvAstah.startState;
255 if (pass==2) tgvAstah.endState->accept = tgv.endState->accept;
254 tgvAstah = generateTransition(n->left,tgvAstah,pass); 256 tgvAstah = generateTransition(n->left,tgvAstah,pass);
255 tgvAstah.asterisk = tgvAstah.startState; 257 tgvAstah.asterisk = tgvAstah.startState;
256 return tgvAstah; 258 return tgvAstah;
257 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ 259 } else if (n->tokenType == 'c' || n->tokenType == 'a'){
258 TGValue tgv1 = tgv; 260 TGValue tgv1 = tgv;
262 } else { 264 } else {
263 int nextState = tgv.endState->stateNum; 265 int nextState = tgv.endState->stateNum;
264 n->nextStateNum = nextState; 266 n->nextStateNum = nextState;
265 n->nextState = tgv.endState; 267 n->nextState = tgv.endState;
266 BitVector bi = createBitVector(nextState); 268 BitVector bi = createBitVector(nextState);
269 if (n->nextState->accept) bi = bitSet(bi,1);
267 setState(n->cc,bi); 270 setState(n->cc,bi);
268 tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc); 271 tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc);
269 } 272 }
270 return tgv1; 273 return tgv1;
271 } else { 274 } else {
294 TGValue generateTransitionList(NodePtr n) { 297 TGValue generateTransitionList(NodePtr n) {
295 TGValue tgv = createTGValue(); 298 TGValue tgv = createTGValue();
296 StatePtr startState = tgv.startState = createState(tgv,n); 299 StatePtr startState = tgv.startState = createState(tgv,n);
297 NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL); 300 NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL);
298 StatePtr endState = tgv.endState = createState(tgv,eof); 301 StatePtr endState = tgv.endState = createState(tgv,eof);
302 endState->accept = true;
299 tgv.startState = startState; 303 tgv.startState = startState;
300 tgv.endState = endState; 304 tgv.endState = endState;
301 tgv = generateTransition(n,tgv,1); 305 tgv = generateTransition(n,tgv,1);
302 printTree(n); 306 printTree(n);
303 if (tgv.tg->totalStateCount > BITBLOCK) { 307 if (tgv.tg->totalStateCount > BITBLOCK) {