changeset 163:f0a347cd9c6a pairPro

fix subsetconstraction.cc
author masa
date Fri, 18 Dec 2015 19:44:07 +0900
parents d7f762404113
children 93d3ad1d20ed
files c/regexParser/subsetConstraction.cc
diffstat 1 files changed, 31 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/c/regexParser/subsetConstraction.cc	Fri Dec 18 19:31:13 2015 +0900
+++ b/c/regexParser/subsetConstraction.cc	Fri Dec 18 19:44:07 2015 +0900
@@ -20,7 +20,7 @@
             cc1->nextState = nextState;
             return cc1;
         }
-    } else if (end == cc->cond.range.begin ) { // 2
+    } else if (end == cc->cond.range.begin && begin != end ) { // 2
         CharClassPtr cc1;
         if (cc->left) {
             cc1 = charClassMerge(cc->left,begin,end-1,nextState);
@@ -38,7 +38,7 @@
         CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.begin,cc1,cc3);
         cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
         return cc2;
-    } else if (end < cc->cond.range.end) {
+    } else if (end < cc->cond.range.end) { // range.begin < end
         if (begin < cc->cond.range.begin) {  // 3
             CharClassPtr cc1;
             if (cc->left) {
@@ -54,7 +54,7 @@
             return cc2;
         }
         if (begin == cc->cond.range.begin) {  // 6
-            CharClassPtr cc2 = createCharClassRange(end,cc->cond.range.end,NULL,cc->right);
+            CharClassPtr cc2 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right);
             cc2->nextState = cc->nextState;
             CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc2);
             cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
@@ -62,7 +62,7 @@
         }
         // 9
         CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL);
-        cc2->nextState = cc2->nextState;
+        cc2->nextState = cc->nextState;
         CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right);
         cc3->nextState = cc->nextState;
         CharClassPtr cc1 = createCharClassRange(begin,end,cc2,cc3);
@@ -85,10 +85,10 @@
             cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
             return cc3;
         }
-        // 10
+        // 10 cond.range.begin < begin
         CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,NULL,cc->right);
         cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
-        CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,NULL,NULL);
+        CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,cc2);
         cc1->nextState = cc->nextState;
         return cc1;
     }
@@ -102,25 +102,19 @@
         }
     }
     if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) {
-        if (end > cc->cond.range.end) {
+        if (end > cc->cond.range.end) { // cond.range.end < end
             if (begin == cc->cond.range.begin) {    // 8
                 CharClassPtr cc1;
-<<<<<<< local
                 if (cc->right) {
-                    cc1 = charClassMerge(cc->right,begin,end-1,nextState);
-=======
-                if (cc->right) {
-                    cc1 = charClassMerge(cc->right,begin,cc->cond.range.end,nextState);
->>>>>>> other
+                    cc1 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState);
                 } else {
-                    cc1 = createCharClassRange(begin,cc->cond.range.end,NULL,NULL);
+                    cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL);
                     cc1->nextState = nextState;
                 }
-                CharClassPtr cc3 = createCharClassRange(cc->cond.range.end+1,end,cc->left,cc1);
+                CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc1);
                 cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
                 return cc3;
             }
-
             if (begin > cc->cond.range.begin) {  // 11
                 CharClassPtr cc1;
                 if (cc->right) {
@@ -129,15 +123,15 @@
                     cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL);
                     cc1->nextState = nextState;
                 }
-                CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,cc->right);
+                CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL);
                 cc3->nextState = cc->nextState;
                 CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,cc3,cc1);
                 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
                 return cc2;
             }
         }
-        // 12
-        if (begin == cc->cond.range.end) {
+        // begin != end && end != cc->cond.range.end
+        if (begin == cc->cond.range.end) { // 12
             CharClassPtr cc1;
             if (cc->right) {
                 cc1 = charClassMerge(cc->right,begin+1,end,nextState);
@@ -150,22 +144,30 @@
                 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
                 return cc2;
             }
-            CharClassPtr cc3;
-            createCharClassRange(cc->cond.range.begin,cc->cond.range.end-1,cc->left,cc->right);
+            CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end-1,cc->left,NULL);
             cc3->nextState = cc->nextState;
             CharClassPtr cc2 = createCharClassRange(cc->cond.range.end,cc->cond.range.end,cc1,cc3);
             cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
             return cc2;
         }
-
     } else if (begin < cc->cond.range.begin) { // 5
-        CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL);
-        cc2->nextState = cc1->nextState;
-        CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right);
-        cc3->nextState = cc->nextState;
-        CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc2,cc3);
-        cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
-        return cc1;
+        CharClassPtr cc1;
+        if (cc->left) {
+            cc1 = charClassMerge(cc->left,begin,cc->cond.range.begin-1,nextState);
+        } else {
+            cc1 =  createCharClassRange(begin,cc->cond.range.begin-1,NULL,NULL);
+            cc1->nextState = nextState;
+        }
+        CharClassPtr cc3;
+        if (cc->right) {
+            cc3 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState);
+        } else {
+            cc3 =  createCharClassRange(cc->cond.range.end+1,end,NULL,NULL);
+            cc3->nextState = nextState;
+        }
+        CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc3);
+        cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer;
+        return cc2;
     } else {
         printf("charClassMerge Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end);
     }