Mercurial > hg > Applications > Grep
comparison regexParser/subsetConstruction.cc @ 228:399380ad95b7
fix generateTransitionGenerator
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 15 Jan 2016 19:48:53 +0900 |
parents | 8be58af605da |
children | 5d66672e5029 |
comparison
equal
deleted
inserted
replaced
227:8be58af605da | 228:399380ad95b7 |
---|---|
210 } | 210 } |
211 | 211 |
212 /** | 212 /** |
213 pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る | 213 pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る |
214 前が * でない + は新しく状態を作る | 214 前が * でない + は新しく状態を作る |
215 * があったら、次の状態はその時の先頭の状態になる | 215 * があったら、次の状態はその時の先頭の状態か次の状態が終了状態ならば終了状態との組み合わせになる |
216 常に先頭の状態を返す | 216 常に先頭の状態を返す |
217 最後が*ならば、それを持ち歩く | 217 最後が*ならば、それを持ち歩く |
218 pass 2: | 218 pass 2: |
219 割り当てられた状態に沿って charclass の行き先を書き換える | 219 割り当てられた状態に沿って charclass の行き先を書き換える |
220 書き換えた charclass を merge する | 220 書き換えた charclass を merge する |
248 TGValue tgv1 = generateTransition(n->left,tgv,pass); | 248 TGValue tgv1 = generateTransition(n->left,tgv,pass); |
249 TGValue tgv2 = generateTransition(n->right,tgv1,pass); | 249 TGValue tgv2 = generateTransition(n->right,tgv1,pass); |
250 return tgv2; | 250 return tgv2; |
251 } else if (n->tokenType == '*') { | 251 } else if (n->tokenType == '*') { |
252 TGValue tgvAstah = tgv; | 252 TGValue tgvAstah = tgv; |
253 tgvAstah.endState = tgvAstah.startState; | 253 if (tgvAstah.endState->bitState.bitContainer & 2) { |
254 tgvAstah.endState = tgvAstah.startState; | |
255 tgvAstah.endState->bitState = bitSet(tgvAstah.endState->bitState,1); | |
256 } else { | |
257 tgvAstah.endState = tgvAstah.startState; | |
258 } | |
254 tgvAstah = generateTransition(n->left,tgvAstah,pass); | 259 tgvAstah = generateTransition(n->left,tgvAstah,pass); |
255 tgvAstah.asterisk = tgvAstah.startState; | 260 tgvAstah.asterisk = tgvAstah.endState; |
256 return tgvAstah; | 261 return tgvAstah; |
257 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ | 262 } else if (n->tokenType == 'c' || n->tokenType == 'a'){ |
258 TGValue tgv1 = tgv; | 263 TGValue tgv1 = tgv; |
259 if (pass==1) { | 264 if (pass==1) { |
260 n->stateNum = tgv.startState->stateNum; | 265 n->stateNum = tgv.startState->stateNum; |