diff regexParser/subsetConstruction.cc @ 220:4dc8d327cc7d

subset construction worked how to handle EOF?
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 02 Jan 2016 00:01:22 +0900
parents d10fa72d8f31
children c38a7b2dd996
line wrap: on
line diff
--- a/regexParser/subsetConstruction.cc	Fri Jan 01 00:05:57 2016 +0900
+++ b/regexParser/subsetConstruction.cc	Sat Jan 02 00:01:22 2016 +0900
@@ -335,6 +335,7 @@
 
 SCValue createSCValue(TGValue tgv) {
     SCValue scv;
+    scv.tg = tgv.tg;
     scv.stateTop = tgv.tg->stateList;
     scv.stateEnd = scv.stateTop;
     while (scv.stateEnd->next) {
@@ -368,21 +369,24 @@
         while (hasNext(cw)) {
             CharClassPtr cc = getNext(cw);
             BitVector bi = cc->nextState;
-            if (scv.stateArray[bi.bitContainer]) continue;
+            if (scv.tg->stateArray[bi.bitContainer]) continue;  // already done
             scv = createState(scv,bi);
             StatePtr s = scv.stateEnd;
-            for (;bi.bitContainer;) {
+            scv.tg->stateArray[bi.bitContainer] = s;
+            for (;;) {
                 int bitPosition = searchBit(bi);
-                unsigned long baseNum = 1 << bitPosition;
+                if (!bitPosition) break;
+                unsigned long baseNum = 1 << (bitPosition-1);
+                // printf("bit %lx pos %d baseNum %lx\n",bi.bitContainer,bitPosition,baseNum);
                 bi.bitContainer ^= baseNum; 
-                StatePtr base = scv.stateArray[baseNum];
-                if (base == NULL) {// error
-                    continue;
+                if (baseNum==2) continue;   // EOF case
+                StatePtr base = scv.tg->stateArray[baseNum];
+                if (base == NULL) {
+                    errorMassege("No base state",__LINE__,__FILE__); break;
                 }
                 CharClassPtr merge = mergeTransition(s,base->cc);
                 s->cc = merge;
             }
-            scv.stateArray[bi.bitContainer] = s;
         }
     }
     return scv;