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