comparison regexParser/subsetConstruction.cc @ 257:ebb429c2b6a7

fix allocate state in generateTransition
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Mon, 25 Jan 2016 19:20:32 +0900
parents 72f3673dd7a5
children 2b36dde3ffb7
comparison
equal deleted inserted replaced
256:72f3673dd7a5 257:ebb429c2b6a7
234 */ 234 */
235 TGValue generateTransition(NodePtr n,TGValue tgv, int pass) { 235 TGValue generateTransition(NodePtr n,TGValue tgv, int pass) {
236 if (n->tokenType == '+') { 236 if (n->tokenType == '+') {
237 TGValue tgvLeft = tgv; 237 TGValue tgvLeft = tgv;
238 tgvLeft.endState = n->right->state; 238 tgvLeft.endState = n->right->state;
239 if (pass==2) n->right->state->accept = tgv.endState->accept;
240 tgvLeft.asterisk = NULL; 239 tgvLeft.asterisk = NULL;
241 tgvLeft = generateTransition(n->left,tgvLeft,pass); 240 tgvLeft = generateTransition(n->left,tgvLeft,pass);
242 TGValue tgvRight = tgv; 241 TGValue tgvRight = tgv;
243 if (tgvLeft.asterisk) { 242 if (tgvLeft.asterisk) {
244 n->right->state = tgv.endState; 243 n->right->state = tgv.endState;
253 } else { 252 } else {
254 tgvRight.startState = n->right->state; 253 tgvRight.startState = n->right->state;
255 tgvRight.tg->stateArray[tgvRight.startState->bitState.bitContainer] = tgvRight.startState ; 254 tgvRight.tg->stateArray[tgvRight.startState->bitState.bitContainer] = tgvRight.startState ;
256 } 255 }
257 tgvRight = generateTransition(n->right,tgvRight,pass); 256 tgvRight = generateTransition(n->right,tgvRight,pass);
257 if (tgv.endState && tgvRight.asterisk) tgvRight.startState->accept = tgv.endState->accept;
258 tgvLeft.asterisk = tgvRight.asterisk; 258 tgvLeft.asterisk = tgvRight.asterisk;
259 return tgvLeft; 259 return tgvLeft;
260 } else if (n->tokenType == '|') { 260 } else if (n->tokenType == '|') {
261 TGValue tgv1 = generateTransition(n->left,tgv,pass); 261 TGValue tgv1 = generateTransition(n->left,tgv,pass);
262 TGValue tgv2 = generateTransition(n->right,tgv1,pass); 262 TGValue tgv2 = generateTransition(n->right,tgv1,pass);
276 } else { 276 } else {
277 int nextState = tgv.endState->stateNum; 277 int nextState = tgv.endState->stateNum;
278 n->nextStateNum = nextState; 278 n->nextStateNum = nextState;
279 n->nextState = tgv.endState; 279 n->nextState = tgv.endState;
280 BitVector bi = createBitVector(nextState); 280 BitVector bi = createBitVector(nextState);
281 if (n->nextState->accept && n->nextState->node->tokenType == '*') bi = bitSet(bi,1); 281 if (n->nextState->accept) bi = bitSet(bi,1);
282 setState(n->cc,bi); 282 setState(n->cc,bi);
283 tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc); 283 tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc);
284 } 284 }
285 return tgv1; 285 return tgv1;
286 } else { 286 } else {