diff regexParser/subsetConstraction.cc @ 192:ecf70fb215a5 pairPro

print charclass
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Fri, 25 Dec 2015 19:31:53 +0900
parents 02031fb73af8
children 4fefd80c05f2
line wrap: on
line diff
--- a/regexParser/subsetConstraction.cc	Fri Dec 25 16:08:02 2015 +0900
+++ b/regexParser/subsetConstraction.cc	Fri Dec 25 19:31:53 2015 +0900
@@ -6,17 +6,14 @@
 #include "subsetConstraction.h"
 #include "node.h"
 #include "BitVector.h"
-
-CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) {
-    CharClassPtr cc = NEW(CharClass);
-    return cc;
-}
+#include "error.h"
 
 CharClassPtr createCharClassRange(unsigned long begin, unsigned long end,unsigned long state, CharClassPtr left, CharClassPtr right) {
     CharClassPtr cc = NEW(CharClass);
     cc->type = 'r';
     cc->cond.range.begin = begin;
     cc->cond.range.end = end;
+    cc->cond.range.next = NULL;
     cc->left = left;
     cc->right = right;
     cc->nextState.bitContainer = state;
@@ -214,8 +211,9 @@
  */
 StatePtr createState(TGValue tg,NodePtr n) {
     StatePtr s = NEW(State);
-    s->next = tg.tg->currentState;
-    tg.tg->currentState = s;
+    s->stateNum = n->stateNum = ++tg.tg->stateMax;
+    s->next = tg.tg->stateList;
+    tg.tg->stateList = s;
     s->node = n;
     BitVector bi = createBitVector(n->stateNum);
     s->bitState = bi;
@@ -239,8 +237,9 @@
             return tgRight;
         }
         TGValue tgRight = tgLeft;
-        tgRight.stateBegin = ++tgRight.stateNum;
         n->right->state = createState(tgRight,n->right);
+        tgRight.startState = n->right->state;
+        stateAllocate(n->right,tgRight);
         return tgLeft;
     } else if (n->tokenType == '|') {
         TGValue tgv  = stateAllocate(n->left,tg);
@@ -248,15 +247,16 @@
         return tgv1;
     } else if (n->tokenType == '*') {
         TGValue tgAstah = tg;
-        tgAstah.stateEnd = tgAstah.stateBegin;
+        tgAstah.endState = tgAstah.startState;
         tgAstah = stateAllocate(n->left,tgAstah);
         tgAstah.asterisk = true;
         return tgAstah;
     } else if (n->tokenType == 'c' || n->tokenType == 'a'){
         TGValue tgv = tg;
         tgv.asterisk = false;
-        n->stateNum = tg.stateBegin;
-        n->nextStateNum = tg.stateEnd;
+        n->stateNum = tg.startState->stateNum;
+        n->nextStateNum = tg.endState->stateNum;
+        n->state = tg.startState;
         return tgv;
     } else {
         return tg;
@@ -270,19 +270,19 @@
  */
 TGValue generateTransition(NodePtr n,TGValue tg) {
     if (n->tokenType == '+') {
-        if (tg.asterisk) {
-            TGValue tgRight = tg;
+        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;
         }
-        StatePtr left = tg.tgState;
-        tg.tgState = n->left->state;
-        // tg.tg->stateArray[tg.tgState->bitState.bitContainer] = tg.tgState;
-        TGValue tgLeft = generateTransition(n->left,tg);
-        tg.tgState = left;
+        StatePtr left = tgLeft.startState;
+        tgLeft.startState = n->right->state;
+        tgLeft.tg->stateArray[tgLeft.startState->bitState.bitContainer] = left;
         TGValue tgv1 = generateTransition(n->right,tgLeft);
+        tgv1.startState = left;
         return tgv1;
     } else if (n->tokenType == '|') {
         TGValue tgv  = generateTransition(n->left,tg);
@@ -297,7 +297,7 @@
         tgv.asterisk = false;
         BitVector bi = createBitVector(n->nextStateNum);
         setState(n->cc,bi);
-        tgv.tgState->cc = mergeTransition(tgv.tgState,n->cc);
+        tgv.startState->cc = mergeTransition(tgv.startState,n->cc);
         return tgv;
     } else {
         return tg;
@@ -306,11 +306,10 @@
 
 TransitionGeneratorPtr createTransitionGenerator() {
     TransitionGeneratorPtr tg = NEW(TransitionGenerator);
-    tg->stateMax = 0;
+    tg->stateMax = -1;
     tg->stack = NULL;
-    tg->state = NEW(State);
     tg->stateArray = NULL;
-    tg->currentState = NULL;
+    tg->stateList = NULL;
     return tg;
 }
 
@@ -320,16 +319,17 @@
     // initiarize tgv
     tgv.asterisk = false;
     tgv.tg = tg;
-    tgv.tg->startState = createState(tgv,n);
+    StatePtr startState = tgv.startState = createState(tgv,n);
     NodePtr eof = createNode(NULL,'e',NULL,NULL,NULL);
-    tgv.tg->endState = createState(tgv,eof);
-    tgv.stateBegin = 0;
-    tgv.stateEnd = 1;
-    tgv.tgState = NULL;
-    stateAllocate(n,tgv);
-    tgv.tg->stateMax = tg->stateMax;
+    StatePtr endState = tgv.endState = createState(tgv,eof);
+    tgv = stateAllocate(n,tgv);
+    if (tg->stateMax > BITBLOCK) {
+        errorMassege("StateMax > BITBLOCK",__LINE__,__FILE__);
+    }
     BitVector bi = createBitVector(tg->stateMax);
-    tgv.tg->stateArray = (StatePtr)calloc(bi.bitContainer*2,sizeof(StatePtr));
+    tgv.tg->stateArray = (StatePtr*)calloc(bi.bitContainer*2,sizeof(StatePtr*));
+    tgv.tg->stateArray[startState->bitState.bitContainer] = startState;
+    tgv.tg->stateArray[endState->bitState.bitContainer] = endState;
     generateTransition(n,tgv);
     return tg;
 }
@@ -341,11 +341,13 @@
         printf("node : %c %d -> %d\n",state->node->tokenType,state->node->stateNum,state->node->nextStateNum);
         nodeNumber = state->node->stateNum;
     }
-    printCharacterClass(state->cc,nodeNumber,4);
+    if (state->cc) {
+        printCharacterClass(state->cc,nodeNumber,4);
+    }
 }
 
 void printState(TransitionGeneratorPtr tg) {
-    StatePtr state = tg->currentState;
+    StatePtr state = tg->stateList;
     for (;state;state = state->next) {
         printState(state);
         putchar('\n');