Mercurial > hg > Applications > Grep
comparison regexParser/subsetConstraction.cc @ 183:7ae0a3070647 pairPro
implement generateTransitionList
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 24 Dec 2015 20:02:09 +0900 |
parents | dbe004d03ef0 |
children | 1da1b2eacb84 |
comparison
equal
deleted
inserted
replaced
182:dbe004d03ef0 | 183:7ae0a3070647 |
---|---|
201 } | 201 } |
202 free(walk); | 202 free(walk); |
203 return ccy; | 203 return ccy; |
204 } | 204 } |
205 | 205 |
206 /** | |
207 作成する state を linked list | |
208 bitvector を index とした配列に BitVectorPtr を格納 | |
209 state に対応する NodePtr を | |
210 */ | |
211 TGValue createState(TGValue tg,NodePtr n) { | |
212 StatePtr s = NEW(State); | |
213 s->next = tg.tg->currentState; | |
214 tg.tg->currentState = s; | |
215 s->node = n; | |
216 BitVector bi = createBitVector(tg.stateBegin); | |
217 s->bitState = bi; | |
218 s->cc = NULL; | |
219 } | |
220 | |
206 TGValue stateAllocate(NodePtr n,TGValue tg) { | 221 TGValue stateAllocate(NodePtr n,TGValue tg) { |
207 TGValue tgv2 = tg; | |
208 if (n->tokenType == '+') { | 222 if (n->tokenType == '+') { |
209 TGValue tgLeft = stateAllocate(n->left,tg); | 223 TGValue tgLeft = stateAllocate(n->left,tg); |
210 if (tgLeft.asterisk) { | 224 if (tgLeft.asterisk) { |
211 TGValue tgRight = tgLeft; | 225 TGValue tgRight = tgLeft; |
212 tgRight.asterisk = false; | 226 tgRight.asterisk = false; |
214 tgRight.asterisk = true; | 228 tgRight.asterisk = true; |
215 return tgRight; | 229 return tgRight; |
216 } | 230 } |
217 TGValue tgRight = tgLeft; | 231 TGValue tgRight = tgLeft; |
218 tgRight.stateBegin = ++tgRight.stateNum; | 232 tgRight.stateBegin = ++tgRight.stateNum; |
219 tgRight.state = NEW(State); | 233 n->right->state = createState(tgRight,n->right); |
220 TGValue tgv1 = stateAllocate(n->right,tgLeft); | 234 TGValue tgv1 = stateAllocate(n->right,tgLeft); |
221 return tgLeft; | 235 return tgLeft; |
222 } else if (n->tokenType == '|') { | 236 } else if (n->tokenType == '|') { |
223 TGValue tgv = stateAllocate(n->left,tg); | 237 TGValue tgv = stateAllocate(n->left,tg); |
224 TGValue tgv1 = stateAllocate(n->right,tgv); | 238 TGValue tgv1 = stateAllocate(n->right,tgv); |
230 tgAstah.asterisk = true; | 244 tgAstah.asterisk = true; |
231 return tgAstah; | 245 return tgAstah; |
232 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ | 246 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ |
233 TGValue tgv = tg; | 247 TGValue tgv = tg; |
234 tgv.asterisk = false; | 248 tgv.asterisk = false; |
235 BitVector bi = createBitVector(tgv.stateEnd); | 249 n->stateNum = tg.stateBegin; |
250 n->nextStateNum = tg.stateEnd; | |
251 return tgv; | |
252 } else { | |
253 return tg; | |
254 } | |
255 } | |
256 | |
257 TGValue generateTransition(NodePtr n,TGValue tg) { | |
258 if (n->tokenType == '+') { | |
259 StatePtr left = tg.state; | |
260 tg.state = n->left->state; | |
261 tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state; | |
262 TGValue tgLeft = generateTransition(n->left,tg); | |
263 tg.state = left; | |
264 TGValue tgv1 = generateTransition(n->right,tgLeft); | |
265 return tgv1; | |
266 } else if (n->tokenType == '|') { | |
267 TGValue tgv = generateTransition(n->left,tg); | |
268 TGValue tgv1 = generateTransition(n->right,tgv); | |
269 return tgv1; | |
270 } else if (n->tokenType == '*') { | |
271 tgAstah = generateTransition(n->left,tgAstah); | |
272 return tgAstah; | |
273 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ | |
274 TGValue tgv = tg; | |
275 BitVector bi = createBitVector(n->nextStateNum); | |
236 setState(n->cc,bi); | 276 setState(n->cc,bi); |
237 tgv.state->cc = mergeTransition(tgv.state,n->cc); | 277 tgv.state->cc = mergeTransition(tgv.state,n->cc); |
238 return tgv; | 278 return tgv; |
239 } else { | 279 } else { |
240 // error | 280 return tg; |
241 } | 281 } |
242 return tgv2; | |
243 } | |
244 | |
245 TGValue generateTransition(NodePtr n,TGValue tg) { | |
246 TGValue tgv2 = tg; | |
247 if (n->tokenType == '+') { | |
248 tgv2.stateBegin = ++tgv.stateNum; | |
249 TGValue tgLeft = generateTransition(n->right,tgv2); | |
250 tgLeft.stateEnd = tgv2.stateBegin; | |
251 TGValue tgv1 = generateTransition(n->left,tgLeft); | |
252 if (tgv1.asterisk) { | |
253 } | |
254 return tgv1; | |
255 } else if (n->tokenType == '|') { | |
256 TGValue tgv = generateTransition(n->left,tg); | |
257 TGValue tgv1 = generateTransition(n->right,tgv); | |
258 tgv.tg = tgv1.tg; | |
259 tgv.asterisk |= tgv1.asterisk; | |
260 return tgv; | |
261 } else if (n->tokenType == '*') { | |
262 TGValue tgv = generateTransition(n->left,tg); | |
263 tgv.asterisk = true; | |
264 return tgv; | |
265 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ | |
266 TGValue tgv = tg; | |
267 tgv.ts = mergeTransition(tgv.ts,n->cc); | |
268 return tgv; | |
269 } else { | |
270 // error | |
271 } | |
272 return tgv2; | |
273 } | 282 } |
274 | 283 |
275 void printTransitionList(TransitionPtr ts) { | 284 void printTransitionList(TransitionPtr ts) { |
276 for (;ts;ts = ts->next) { | 285 for (;ts;ts = ts->next) { |
277 printf("\n"); | 286 printf("\n"); |
298 return tg; | 307 return tg; |
299 } | 308 } |
300 | 309 |
301 TransitionGenerator generateTransitionList(NodePtr n) { | 310 TransitionGenerator generateTransitionList(NodePtr n) { |
302 TransitionGenerator tg = createTransitionGenerator(); | 311 TransitionGenerator tg = createTransitionGenerator(); |
303 generateTransition(n,tg); | 312 TGValue tgv; |
313 tgv.asterisk = false; | |
314 tgv.tg = tg; | |
315 StatePtr start = createState(tgv,n); | |
316 NodePtr eof = createNode(); | |
317 StatePtr end = createState(tgv,eof); | |
318 tgv.stateBegin = 0; | |
319 tgv.stateEnd = 1; | |
320 stateAllocate(n,tgv); | |
321 tgv.tg.stateArray = (StatePtr)calloc(tg.stateNum,sizeof(StatePtr)); | |
322 generateTransition(n,tgv); | |
304 printTransitionList(tg.ts); | 323 printTransitionList(tg.ts); |
305 return tg; | 324 return tg; |
306 } | 325 } |