# HG changeset patch # User Masataka Kohagura # Date 1451105292 -32400 # Node ID 4fefd80c05f2d9236dc47ecfc24e0d652ad7f35e # Parent b9db09ff630f2eea6b960c48d0d07b7262eb2d2a change variable name (TGValue tg -> TGValue tgv) diff -r b9db09ff630f -r 4fefd80c05f2 regexParser/main.cc --- a/regexParser/main.cc Fri Dec 25 20:17:42 2015 +0900 +++ b/regexParser/main.cc Sat Dec 26 13:48:12 2015 +0900 @@ -16,8 +16,8 @@ } printf("regex : %s\n",ri.ptr); NodePtr n = regex(&ri); + TransitionGeneratorPtr tg = generateTransitionList(n); printTree(n); - TransitionGeneratorPtr tg = generateTransitionList(n); printState(tg); return 0; } diff -r b9db09ff630f -r 4fefd80c05f2 regexParser/node.cc --- a/regexParser/node.cc Fri Dec 25 20:17:42 2015 +0900 +++ b/regexParser/node.cc Sat Dec 26 13:48:12 2015 +0900 @@ -33,7 +33,7 @@ for (int i = 0; i < n->cc->cond.w.length; i++) { putchar(n->cc->cond.w.word[i]); } - printf("(%d)\n",n->stateNum); + printf("(%ld)\n",n->state->bitState.bitContainer); } else if (n->tokenType == 'c') { printCharacterClass(n->cc,n->stateNum,d); } else if (n->tokenType == 'a') { diff -r b9db09ff630f -r 4fefd80c05f2 regexParser/regexParser.h --- a/regexParser/regexParser.h Fri Dec 25 20:17:42 2015 +0900 +++ b/regexParser/regexParser.h Sat Dec 26 13:48:12 2015 +0900 @@ -48,6 +48,7 @@ int stateNum; int nextStateNum; StatePtr state; + StatePtr nextState; struct node *left; struct node *right; } Node, *NodePtr; diff -r b9db09ff630f -r 4fefd80c05f2 regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Fri Dec 25 20:17:42 2015 +0900 +++ b/regexParser/subsetConstraction.cc Sat Dec 26 13:48:12 2015 +0900 @@ -209,11 +209,11 @@ bitvector を index とした配列に BitVectorPtr を格納 state に対応する NodePtr を */ -StatePtr createState(TGValue tg,NodePtr n) { +StatePtr createState(TGValue tgv,NodePtr n) { StatePtr s = NEW(State); - s->stateNum = n->stateNum = ++tg.tg->stateMax; - s->next = tg.tg->stateList; - tg.tg->stateList = s; + s->stateNum = n->stateNum = ++tgv.tg->stateMax; + s->next = tgv.tg->stateList; + tgv.tg->stateList = s; s->node = n; BitVector bi = createBitVector(n->stateNum); s->bitState = bi; @@ -226,40 +226,41 @@ 前が * でない + は新しく状態を作る * があったら、次の状態はその時の先頭の状態になる */ -TGValue stateAllocate(NodePtr n,TGValue tg) { +TGValue stateAllocate(NodePtr n,TGValue tgv) { if (n->tokenType == '+') { - TGValue tgLeft = stateAllocate(n->left,tg); - if (tgLeft.asterisk) { - TGValue tgRight = tgLeft; - tgRight.asterisk = false; - tgRight = stateAllocate(n->right,tgRight); - tgRight.asterisk = true; - return tgRight; + TGValue tgvLeft = stateAllocate(n->left,tgv); + if (tgvLeft.asterisk) { + TGValue tgvRight = tgvLeft; + tgvRight.asterisk = false; + tgvRight = stateAllocate(n->right,tgvRight); + tgvRight.asterisk = true; + return tgvRight; } - TGValue tgRight = tgLeft; - n->right->state = createState(tgRight,n->right); - tgRight.startState = n->right->state; - stateAllocate(n->right,tgRight); - return tgLeft; + TGValue tgvRight = tgvLeft; + n->right->state = createState(tgvRight,n->right); + tgvRight.startState = n->right->state; + stateAllocate(n->right,tgvRight); + return tgvLeft; } else if (n->tokenType == '|') { - TGValue tgv = stateAllocate(n->left,tg); - TGValue tgv1 = stateAllocate(n->right,tgv); - return tgv1; + TGValue tgv1 = stateAllocate(n->left,tgv); + TGValue tgv2 = stateAllocate(n->right,tgv1); + return tgv2; } else if (n->tokenType == '*') { - TGValue tgAstah = tg; - tgAstah.endState = tgAstah.startState; - tgAstah = stateAllocate(n->left,tgAstah); - tgAstah.asterisk = true; - return tgAstah; + TGValue tgvAstah = tgv; + tgvAstah.endState = tgvAstah.startState; + tgvAstah = stateAllocate(n->left,tgvAstah); + tgvAstah.asterisk = true; + return tgvAstah; } else if (n->tokenType == 'c' || n->tokenType == 'a'){ - TGValue tgv = tg; - tgv.asterisk = false; - n->stateNum = tg.startState->stateNum; - n->nextStateNum = tg.endState->stateNum; - n->state = tg.startState; + TGValue tgv1 = tgv; + tgv1.asterisk = false; + n->stateNum = tgv.startState->stateNum; + n->nextStateNum = tgv.endState->stateNum; + n->state = tgv.startState; + n->nextState = tgv.endState; + return tgv1; + } else { return tgv; - } else { - return tg; } } @@ -268,39 +269,39 @@ 書き換えた charclass を merge する 前の部分に * がない + は新しい状態をつくるので、state を切り替えて生成する */ -TGValue generateTransition(NodePtr n,TGValue tg) { +TGValue generateTransition(NodePtr n,TGValue tgv) { if (n->tokenType == '+') { - TGValue tgLeft = generateTransition(n->left,tg); - if (tgLeft.asterisk) { - TGValue tgRight = tgLeft; - tgRight.asterisk = false; - tgRight = generateTransition(n->right,tgRight); - tgRight.asterisk = true; - return tgRight; + TGValue tgvLeft = generateTransition(n->left,tgv); + if (tgvLeft.asterisk) { + TGValue tgvRight = tgvLeft; + tgvRight.asterisk = false; + tgvRight = generateTransition(n->right,tgvRight); + tgvRight.asterisk = true; + return tgvRight; } - StatePtr left = tgLeft.startState; - tgLeft.startState = n->right->state; - tgLeft.tg->stateArray[tgLeft.startState->bitState.bitContainer] = left; - TGValue tgv1 = generateTransition(n->right,tgLeft); + StatePtr left = tgvLeft.startState; + tgvLeft.startState = n->right->state; + tgvLeft.tg->stateArray[tgvLeft.startState->bitState.bitContainer] = left; + TGValue tgv1 = generateTransition(n->right,tgvLeft); tgv1.startState = left; return tgv1; } else if (n->tokenType == '|') { - TGValue tgv = generateTransition(n->left,tg); - TGValue tgv1 = generateTransition(n->right,tgv); - return tgv1; + TGValue tgv1 = generateTransition(n->left,tgv); + TGValue tgv2 = generateTransition(n->right,tgv1); + return tgv2; } else if (n->tokenType == '*') { - TGValue tgAstah = generateTransition(n->left,tg); - tgAstah.asterisk = true; - return tgAstah; + TGValue tgvAstah = generateTransition(n->left,tgv); + tgvAstah.asterisk = true; + return tgvAstah; } else if (n->tokenType == 'c' || n->tokenType == 'a'){ - TGValue tgv = tg; - tgv.asterisk = false; + TGValue tgv1 = tgv; + tgv1.asterisk = false; BitVector bi = createBitVector(n->nextStateNum); setState(n->cc,bi); - tgv.startState->cc = mergeTransition(tgv.startState,n->cc); + tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc); + return tgv1; + } else { return tgv; - } else { - return tg; } } @@ -338,8 +339,9 @@ printf("state : %lx\n",state->bitState.bitContainer); long nodeNumber = 0; if (state->node) { - printf("node : %c %d -> %d\n",state->node->tokenType,state->node->stateNum,state->node->nextStateNum); - nodeNumber = state->node->stateNum; + printf("node : %c %lx -> %d\n",state->node->tokenType,state->bitState.bitContainer,state->node->nextStateNum); + if (state->node->state) + nodeNumber = state->node->state->bitState.bitContainer; } if (state->cc) { printCharacterClass(state->cc,nodeNumber,4);