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