diff regexParser/subsetConstraction.cc @ 178:5e8c6857934c pairPro

implement charClassMerge
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Wed, 23 Dec 2015 19:17:36 +0900
parents 8de9a33f6ae5
children d97bcab546e8
line wrap: on
line diff
--- a/regexParser/subsetConstraction.cc	Wed Dec 23 17:28:59 2015 +0900
+++ b/regexParser/subsetConstraction.cc	Wed Dec 23 19:17:36 2015 +0900
@@ -159,9 +159,12 @@
     return current;
 }
 
-TransitionPtr mergeTransition(TransitionPtr x,TransitionPtr y) {
-    CharClassWalkerPtr walk = createCharClassWalker(x->condition);
-    CharClassPtr ccy = y->condition;
+CharClassPtr mergeTransition(StatePtr x,CharClassPtr y) {
+    if (x->cc == NULL) {
+        return y;
+    }
+    CharClassWalkerPtr walk = createCharClassWalker(x->cc);
+    CharClassPtr ccy = y;
     BitVector bi;
     for (CharClassPtr cc = getNext(walk); hasNext(walk); cc=getNext(walk)) {
         unsigned long begin = cc->cond.range.begin;
@@ -169,41 +172,34 @@
         bi = cc->nextState;
         ccy = charClassMerge(ccy,begin,end,bi);
     }
-    TransitionPtr z = createTransition(ccy,&bi);
     free(walk);
-    return z;
+    return ccy;
 }
 
-TGValue generateTransition(NodePtr n,TransitionGenerator tg) {
+TGValue generateTransition(NodePtr n,TGValue tg) {
     TGValue tgv2;
     if (n->tokenType == '+') {
         TGValue tgv = generateTransition(n->right,tg);
-        TGValue tgv1 = generateTransition(n->left,tg);
         if (tgv.asterisk) {
-            tgv1.ts = mergeTransition(tgv.ts,tgv1.ts);
+            TGValue tgv1 = generateTransition(n->left,tgv);
             return tgv1;
         }
+        TGValue tgLeft = createTransitionGenerator(tgv);
+        TGValue tgv1 = generateTransition(n->left,tgLeft);
         return tgv;
     } else if (n->tokenType == '|') {
         TGValue tgv  = generateTransition(n->left,tg);
-        TGValue tgv1 = generateTransition(n->right,tg);
+        TGValue tgv1 = generateTransition(n->right,tgv);
         tgv.tg = tgv1.tg;
-        tgv.ts = mergeTransition(tgv.ts,tgv1.ts);
         tgv.asterisk |= tgv1.asterisk;
         return tgv;
     } else if (n->tokenType == '*') {
         TGValue tgv = generateTransition(n->left,tg);
         tgv.asterisk = true;
         return tgv;
-    } else if (n->tokenType == 'c'){
-        tgv2.ts = createTransition(n->cc,0);
-        return tgv2;
-    } else if (n->tokenType == 'a'){
-        TGValue tgv;
-        tgv.ts = NEW(Transition);
-        tgv.ts->condition = n->cc;
-        bitSet(&tgv.ts->condition->nextState,n->nodeNumber);
-        tg.ts = appendTransition(tg.ts,tgv.ts);
+    } else if (n->tokenType == 'c' || n->tokenType == 'a'){
+        TGValue tgv = tg;
+        tgv.ts = mergeTransition(tgv.ts,n->cc);
         return tgv;
     } else {
         // error