# HG changeset patch # User Shinji KONO # Date 1451468221 -32400 # Node ID a9e3512120e2b98f1e2825a974297736b95a8f79 # Parent 4852bfa85db471231875194b8d070b5cbce2e8c1 NFA generation end diff -r 4852bfa85db4 -r a9e3512120e2 regexParser/main.cc --- a/regexParser/main.cc Wed Dec 30 15:05:06 2015 +0900 +++ b/regexParser/main.cc Wed Dec 30 18:37:01 2015 +0900 @@ -29,6 +29,7 @@ if (generate) { // NFA generation TGValue tgv = generateTransitionList(n); + printTree(n); printState(tgv.tg); } else if (subset) { TGValue tgv = generateTransitionList(n); diff -r 4852bfa85db4 -r a9e3512120e2 regexParser/node.cc --- a/regexParser/node.cc Wed Dec 30 15:05:06 2015 +0900 +++ b/regexParser/node.cc Wed Dec 30 18:37:01 2015 +0900 @@ -33,8 +33,10 @@ for (int i = 0; i < n->cc->cond.w.length; i++) { putchar(n->cc->cond.w.word[i]); } - if (n->state) { + if (n->state && n->nextState) { printf("(%ld)->(%ld)\n",n->state->bitState.bitContainer,n->nextState->bitState.bitContainer); + } else if (n->state) { + printf("(%ld)\n",n->state->bitState.bitContainer); } else { printf("\n"); } diff -r 4852bfa85db4 -r a9e3512120e2 regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Wed Dec 30 15:05:06 2015 +0900 +++ b/regexParser/subsetConstruction.cc Wed Dec 30 18:37:01 2015 +0900 @@ -224,8 +224,8 @@ TGValue tgvLeft = tgv; tgvLeft.endState = n->right->state; tgvLeft.asterisk = NULL; - tgvLeft = generateTransition(n->left,tgv,pass); - TGValue tgvRight = tgvLeft; + tgvLeft = generateTransition(n->left,tgvLeft,pass); + TGValue tgvRight = tgv; if (tgvLeft.asterisk) { n->right->state = tgv.endState; tgvRight.startState = tgvRight.asterisk; @@ -237,8 +237,8 @@ if (pass==1) { n->right->state = tgvRight.startState = createState(tgvRight,n->right); } else { - tgvLeft.startState = n->right->state; - tgvLeft.tg->stateArray[tgvLeft.startState->bitState.bitContainer] = tgvLeft.startState ; + tgvRight.startState = n->right->state; + tgvRight.tg->stateArray[tgvRight.startState->bitState.bitContainer] = tgvRight.startState ; } tgvRight = generateTransition(n->right,tgvRight,pass); tgvLeft.asterisk = tgvRight.asterisk; @@ -257,11 +257,12 @@ TGValue tgv1 = tgv; if (pass==1) { n->stateNum = tgv.startState->stateNum; - n->nextStateNum = tgv.endState->stateNum; - n->state = tgv.startState;; + n->state = tgv.startState; + } else { + int nextState = tgv.endState->stateNum; + n->nextStateNum = nextState; n->nextState = tgv.endState; - } else { - BitVector bi = createBitVector(n->nextStateNum); + BitVector bi = createBitVector(nextState); setState(n->cc,bi); tgv1.startState->cc = mergeTransition(tgv1.startState,n->cc); } @@ -294,6 +295,8 @@ StatePtr startState = tgv.startState = createState(tgv,n); NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL); StatePtr endState = tgv.endState = createState(tgv,eof); + tgv.startState = startState; + tgv.endState = endState; tgv = generateTransition(n,tgv,1); printTree(n); if (tgv.tg->totalStateCount > BITBLOCK) { @@ -303,6 +306,8 @@ tgv.tg->stateArray = (StatePtr*)calloc(bi.bitContainer*2,sizeof(StatePtr*)); tgv.tg->stateArray[startState->bitState.bitContainer] = startState; tgv.tg->stateArray[endState->bitState.bitContainer] = endState; + tgv.startState = startState; + tgv.endState = endState; tgv = generateTransition(n,tgv,2); return tgv; }