diff regexParser/subsetConstraction.cc @ 182:dbe004d03ef0 pairPro

implement stateAllocate()
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Thu, 24 Dec 2015 19:14:49 +0900
parents 3c4db09b8581
children 7ae0a3070647
line wrap: on
line diff
--- a/regexParser/subsetConstraction.cc	Thu Dec 24 18:00:55 2015 +0900
+++ b/regexParser/subsetConstraction.cc	Thu Dec 24 19:14:49 2015 +0900
@@ -175,6 +175,17 @@
     return current;
 }
 
+void setState(CharClassPtr cc, BitVector bi) {
+    setState(cc,bi);
+    if (cc->left) {
+        setState(cc->left,bi);
+    }
+    cc->nextState = bi;
+    if (cc->right) {
+        setState(cc->right,bi);
+    }
+}
+
 CharClassPtr mergeTransition(StatePtr x,CharClassPtr y) {
     if (x->cc == NULL) {
         return y;
@@ -192,17 +203,55 @@
     return ccy;
 }
 
-TGValue generateTransition(NodePtr n,TGValue tg) {
-    TGValue tgv2;
+TGValue stateAllocate(NodePtr n,TGValue tg) {
+    TGValue tgv2 = tg;
     if (n->tokenType == '+') {
-        TGValue tgv = generateTransition(n->right,tg);
-        if (tgv.asterisk) {
-            TGValue tgv1 = generateTransition(n->left,tgv);
-            return tgv1;
+        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 tgLeft = createTransitionGenerator(tgv);
+        TGValue tgRight = tgLeft;
+        tgRight.stateBegin = ++tgRight.stateNum;
+        tgRight.state = NEW(State);
+        TGValue tgv1 = stateAllocate(n->right,tgLeft);
+        return tgLeft;
+    } else if (n->tokenType == '|') {
+        TGValue tgv  = stateAllocate(n->left,tg);
+        TGValue tgv1 = stateAllocate(n->right,tgv);
+        return tgv1;
+    } else if (n->tokenType == '*') {
+        TGValue tgAstah = tg;
+        tgAstah.stateEnd = tgAstah.stateBegin;
+        tgAstah = stateAllocate(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(tgv.stateEnd);
+        setState(n->cc,bi);
+        tgv.state->cc = mergeTransition(tgv.state,n->cc);
+        return tgv;
+    } else {
+        // error
+    }
+    return tgv2;
+}
+
+TGValue generateTransition(NodePtr n,TGValue tg) {
+    TGValue tgv2 = tg;
+    if (n->tokenType == '+') {
+        tgv2.stateBegin = ++tgv.stateNum;
+        TGValue tgLeft = generateTransition(n->right,tgv2);
+        tgLeft.stateEnd = tgv2.stateBegin;
         TGValue tgv1 = generateTransition(n->left,tgLeft);
-        return tgv;
+        if (tgv1.asterisk) {
+        }
+        return tgv1;
     } else if (n->tokenType == '|') {
         TGValue tgv  = generateTransition(n->left,tg);
         TGValue tgv1 = generateTransition(n->right,tgv);