changeset 196:9f96223f54aa

merge
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Sat, 26 Dec 2015 13:51:11 +0900
parents 093bbd028ee3 (current diff) 4fefd80c05f2 (diff)
children 35608dc85e83
files
diffstat 4 files changed, 62 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/regexParser/main.cc	Fri Dec 25 20:17:11 2015 +0900
+++ b/regexParser/main.cc	Sat Dec 26 13:51:11 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;
 }
--- a/regexParser/node.cc	Fri Dec 25 20:17:11 2015 +0900
+++ b/regexParser/node.cc	Sat Dec 26 13:51:11 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') {
--- a/regexParser/regexParser.h	Fri Dec 25 20:17:11 2015 +0900
+++ b/regexParser/regexParser.h	Sat Dec 26 13:51:11 2015 +0900
@@ -48,6 +48,7 @@
     int stateNum;
     int nextStateNum;
     StatePtr state;
+    StatePtr nextState;
     struct node *left;
     struct node *right;
 } Node, *NodePtr;
--- a/regexParser/subsetConstraction.cc	Fri Dec 25 20:17:11 2015 +0900
+++ b/regexParser/subsetConstraction.cc	Sat Dec 26 13:51:11 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);