Mercurial > hg > Applications > Grep
comparison regexParser/subsetConstraction.cc @ 185:d25f4f3b4c34 pairPro
add comment
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 24 Dec 2015 20:27:49 +0900 |
parents | 1da1b2eacb84 |
children | 3e8aae8beba9 |
comparison
equal
deleted
inserted
replaced
184:1da1b2eacb84 | 185:d25f4f3b4c34 |
---|---|
216 BitVector bi = createBitVector(tg.stateBegin); | 216 BitVector bi = createBitVector(tg.stateBegin); |
217 s->bitState = bi; | 217 s->bitState = bi; |
218 s->cc = NULL; | 218 s->cc = NULL; |
219 } | 219 } |
220 | 220 |
221 /** | |
222 正規表現に必要な状態を探して、それぞれに番号を割り振る | |
223 前が * でない + は新しく状態を作る | |
224 * があったら、次の状態はその時の先頭の状態になる | |
225 */ | |
221 TGValue stateAllocate(NodePtr n,TGValue tg) { | 226 TGValue stateAllocate(NodePtr n,TGValue tg) { |
222 if (n->tokenType == '+') { | 227 if (n->tokenType == '+') { |
223 TGValue tgLeft = stateAllocate(n->left,tg); | 228 TGValue tgLeft = stateAllocate(n->left,tg); |
224 if (tgLeft.asterisk) { | 229 if (tgLeft.asterisk) { |
225 TGValue tgRight = tgLeft; | 230 TGValue tgRight = tgLeft; |
252 } else { | 257 } else { |
253 return tg; | 258 return tg; |
254 } | 259 } |
255 } | 260 } |
256 | 261 |
262 /** | |
263 割り当てられた状態に沿って charclass の行き先を書き換える | |
264 書き換えた charclass を merge する | |
265 前の部分に * がない + は新しい状態をつくるので、state を切り替えて生成する | |
266 */ | |
257 TGValue generateTransition(NodePtr n,TGValue tg) { | 267 TGValue generateTransition(NodePtr n,TGValue tg) { |
258 if (n->tokenType == '+') { | 268 if (n->tokenType == '+') { |
269 if (tg.asterisk) { | |
270 TGValue tgRight = tg; | |
271 tgRight.asterisk = false; | |
272 tgRight = generateTransition(n->right,tgRight); | |
273 tgRight.asterisk = true; | |
274 return tgRight; | |
275 } | |
259 StatePtr left = tg.state; | 276 StatePtr left = tg.state; |
260 tg.state = n->left->state; | 277 tg.state = n->left->state; |
261 tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state; | 278 tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state; |
262 TGValue tgLeft = generateTransition(n->left,tg); | 279 TGValue tgLeft = generateTransition(n->left,tg); |
263 tg.state = left; | 280 tg.state = left; |
267 TGValue tgv = generateTransition(n->left,tg); | 284 TGValue tgv = generateTransition(n->left,tg); |
268 TGValue tgv1 = generateTransition(n->right,tgv); | 285 TGValue tgv1 = generateTransition(n->right,tgv); |
269 return tgv1; | 286 return tgv1; |
270 } else if (n->tokenType == '*') { | 287 } else if (n->tokenType == '*') { |
271 tgAstah = generateTransition(n->left,tgAstah); | 288 tgAstah = generateTransition(n->left,tgAstah); |
289 tgAstah.asterisk = true; | |
272 return tgAstah; | 290 return tgAstah; |
273 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ | 291 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ |
274 TGValue tgv = tg; | 292 TGValue tgv = tg; |
293 tgv.asterisk = false; | |
275 BitVector bi = createBitVector(n->nextStateNum); | 294 BitVector bi = createBitVector(n->nextStateNum); |
276 setState(n->cc,bi); | 295 setState(n->cc,bi); |
277 tgv.state->cc = mergeTransition(tgv.state,n->cc); | 296 tgv.state->cc = mergeTransition(tgv.state,n->cc); |
278 return tgv; | 297 return tgv; |
279 } else { | 298 } else { |