# HG changeset patch # User Masataka Kohagura # Date 1450956469 -32400 # Node ID d25f4f3b4c340351d192aa8f72f83ea1bf006840 # Parent 1da1b2eacb849f4d13d67a1093a7674442b8474c add comment diff -r 1da1b2eacb84 -r d25f4f3b4c34 regexParser/regexParser.cc --- a/regexParser/regexParser.cc Thu Dec 24 20:09:21 2015 +0900 +++ b/regexParser/regexParser.cc Thu Dec 24 20:27:49 2015 +0900 @@ -26,7 +26,7 @@ } static -NodePtr createNode(RegexInfoPtr ri,unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) { +NodePtr createNode(unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) { NodePtr n = allocateNode(); n->tokenType = type; n->cc = cc; diff -r 1da1b2eacb84 -r d25f4f3b4c34 regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Thu Dec 24 20:09:21 2015 +0900 +++ b/regexParser/subsetConstraction.cc Thu Dec 24 20:27:49 2015 +0900 @@ -218,6 +218,11 @@ s->cc = NULL; } +/** +正規表現に必要な状態を探して、それぞれに番号を割り振る +前が * でない + は新しく状態を作る +* があったら、次の状態はその時の先頭の状態になる + */ TGValue stateAllocate(NodePtr n,TGValue tg) { if (n->tokenType == '+') { TGValue tgLeft = stateAllocate(n->left,tg); @@ -254,8 +259,20 @@ } } +/** +割り当てられた状態に沿って charclass の行き先を書き換える +書き換えた charclass を merge する +前の部分に * がない + は新しい状態をつくるので、state を切り替えて生成する + */ TGValue generateTransition(NodePtr n,TGValue tg) { if (n->tokenType == '+') { + if (tg.asterisk) { + TGValue tgRight = tg; + tgRight.asterisk = false; + tgRight = generateTransition(n->right,tgRight); + tgRight.asterisk = true; + return tgRight; + } StatePtr left = tg.state; tg.state = n->left->state; tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state; @@ -269,9 +286,11 @@ return tgv1; } else if (n->tokenType == '*') { tgAstah = generateTransition(n->left,tgAstah); + tgAstah.asterisk = true; return tgAstah; } else if (n->tokenType == 'c' || n->tokenType == 'a'){ TGValue tgv = tg; + tgv.asterisk = false; BitVector bi = createBitVector(n->nextStateNum); setState(n->cc,bi); tgv.state->cc = mergeTransition(tgv.state,n->cc);