Mercurial > hg > Applications > Grep
comparison regexParser/subsetConstruction.cc @ 217:a9e3512120e2
NFA generation end
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 30 Dec 2015 18:37:01 +0900 |
parents | 4852bfa85db4 |
children | d10fa72d8f31 |
comparison
equal
deleted
inserted
replaced
216:4852bfa85db4 | 217:a9e3512120e2 |
---|---|
222 TGValue generateTransition(NodePtr n,TGValue tgv, int pass) { | 222 TGValue generateTransition(NodePtr n,TGValue tgv, int pass) { |
223 if (n->tokenType == '+') { | 223 if (n->tokenType == '+') { |
224 TGValue tgvLeft = tgv; | 224 TGValue tgvLeft = tgv; |
225 tgvLeft.endState = n->right->state; | 225 tgvLeft.endState = n->right->state; |
226 tgvLeft.asterisk = NULL; | 226 tgvLeft.asterisk = NULL; |
227 tgvLeft = generateTransition(n->left,tgv,pass); | 227 tgvLeft = generateTransition(n->left,tgvLeft,pass); |
228 TGValue tgvRight = tgvLeft; | 228 TGValue tgvRight = tgv; |
229 if (tgvLeft.asterisk) { | 229 if (tgvLeft.asterisk) { |
230 n->right->state = tgv.endState; | 230 n->right->state = tgv.endState; |
231 tgvRight.startState = tgvRight.asterisk; | 231 tgvRight.startState = tgvRight.asterisk; |
232 tgvRight = generateTransition(n->right,tgvRight,pass); | 232 tgvRight = generateTransition(n->right,tgvRight,pass); |
233 tgvLeft.asterisk = tgvRight.asterisk; | 233 tgvLeft.asterisk = tgvRight.asterisk; |
235 } | 235 } |
236 tgvRight.asterisk = NULL; | 236 tgvRight.asterisk = NULL; |
237 if (pass==1) { | 237 if (pass==1) { |
238 n->right->state = tgvRight.startState = createState(tgvRight,n->right); | 238 n->right->state = tgvRight.startState = createState(tgvRight,n->right); |
239 } else { | 239 } else { |
240 tgvLeft.startState = n->right->state; | 240 tgvRight.startState = n->right->state; |
241 tgvLeft.tg->stateArray[tgvLeft.startState->bitState.bitContainer] = tgvLeft.startState ; | 241 tgvRight.tg->stateArray[tgvRight.startState->bitState.bitContainer] = tgvRight.startState ; |
242 } | 242 } |
243 tgvRight = generateTransition(n->right,tgvRight,pass); | 243 tgvRight = generateTransition(n->right,tgvRight,pass); |
244 tgvLeft.asterisk = tgvRight.asterisk; | 244 tgvLeft.asterisk = tgvRight.asterisk; |
245 return tgvLeft; | 245 return tgvLeft; |
246 } else if (n->tokenType == '|') { | 246 } else if (n->tokenType == '|') { |
255 return tgvAstah; | 255 return tgvAstah; |
256 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ | 256 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ |
257 TGValue tgv1 = tgv; | 257 TGValue tgv1 = tgv; |
258 if (pass==1) { | 258 if (pass==1) { |
259 n->stateNum = tgv.startState->stateNum; | 259 n->stateNum = tgv.startState->stateNum; |
260 n->nextStateNum = tgv.endState->stateNum; | 260 n->state = tgv.startState; |
261 n->state = tgv.startState;; | 261 } else { |
262 int nextState = tgv.endState->stateNum; | |
263 n->nextStateNum = nextState; | |
262 n->nextState = tgv.endState; | 264 n->nextState = tgv.endState; |
263 } else { | 265 BitVector bi = createBitVector(nextState); |
264 BitVector bi = createBitVector(n->nextStateNum); | |
265 setState(n->cc,bi); | 266 setState(n->cc,bi); |
266 tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc); | 267 tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc); |
267 } | 268 } |
268 return tgv1; | 269 return tgv1; |
269 } else { | 270 } else { |
292 TGValue generateTransitionList(NodePtr n) { | 293 TGValue generateTransitionList(NodePtr n) { |
293 TGValue tgv = createTGValue(); | 294 TGValue tgv = createTGValue(); |
294 StatePtr startState = tgv.startState = createState(tgv,n); | 295 StatePtr startState = tgv.startState = createState(tgv,n); |
295 NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL); | 296 NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL); |
296 StatePtr endState = tgv.endState = createState(tgv,eof); | 297 StatePtr endState = tgv.endState = createState(tgv,eof); |
298 tgv.startState = startState; | |
299 tgv.endState = endState; | |
297 tgv = generateTransition(n,tgv,1); | 300 tgv = generateTransition(n,tgv,1); |
298 printTree(n); | 301 printTree(n); |
299 if (tgv.tg->totalStateCount > BITBLOCK) { | 302 if (tgv.tg->totalStateCount > BITBLOCK) { |
300 errorMassege("StateMax > BITBLOCK",__LINE__,__FILE__); | 303 errorMassege("StateMax > BITBLOCK",__LINE__,__FILE__); |
301 } | 304 } |
302 BitVector bi = createBitVector(tgv.tg->totalStateCount); | 305 BitVector bi = createBitVector(tgv.tg->totalStateCount); |
303 tgv.tg->stateArray = (StatePtr*)calloc(bi.bitContainer*2,sizeof(StatePtr*)); | 306 tgv.tg->stateArray = (StatePtr*)calloc(bi.bitContainer*2,sizeof(StatePtr*)); |
304 tgv.tg->stateArray[startState->bitState.bitContainer] = startState; | 307 tgv.tg->stateArray[startState->bitState.bitContainer] = startState; |
305 tgv.tg->stateArray[endState->bitState.bitContainer] = endState; | 308 tgv.tg->stateArray[endState->bitState.bitContainer] = endState; |
309 tgv.startState = startState; | |
310 tgv.endState = endState; | |
306 tgv = generateTransition(n,tgv,2); | 311 tgv = generateTransition(n,tgv,2); |
307 return tgv; | 312 return tgv; |
308 } | 313 } |
309 | 314 |
310 void printState(StatePtr state) { | 315 void printState(StatePtr state) { |