diff regexParser/generateSequentialSearch.cc @ 298:63213964502a

refactoring ....
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 03 Feb 2016 12:24:34 +0900
parents f2491681914e
children 1188debbef10
line wrap: on
line diff
--- a/regexParser/generateSequentialSearch.cc	Tue Feb 02 11:58:59 2016 +0900
+++ b/regexParser/generateSequentialSearch.cc	Wed Feb 03 12:24:34 2016 +0900
@@ -4,7 +4,35 @@
 #include "generateSequentialSearch.h"
 #include "subsetConstruction.h"
 
-void exportState(TransitionGeneratorPtr tg) {
+void
+generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
+    fprintf(fp,"TSValue state%lx(TSValue tsv) {\n",stateNum);
+    if (accept && state->accept) {
+        fputs("    tsv=tsv.tg->stateMatch(tsv);\n",fp);
+    }
+    fputs("    if (tsv.buff.buffptr >= tsv.buff.buffend) return tsv;\n",fp);
+    CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
+    if (hasNext(ccw)) fputs("    unsigned char c = *tsv.buff.buffptr++;\n",fp);
+    fputs("    if (0) ;\n",fp);
+    while (hasNext(ccw)) {
+        CharClassPtr cc = getNext(ccw);
+        unsigned long begin = cc->cond.range.begin;
+        unsigned long end = cc->cond.range.end;
+        BitVector bi = cc->nextState;
+        if (begin == end) {
+            fprintf(fp,"    else if (c=='%c') { return state%lx(tsv);}\n",(unsigned char)begin, bi.bitContainer);
+        } else {
+            fprintf(fp,"    else if (c<'%c')  { tsv=tsv.tg->stateSkip(tsv);return state0(tsv);}\n",(unsigned char)begin);
+            fprintf(fp,"    else if (c<='%c') { return state%lx(tsv);} \n",(unsigned char)end,  bi.bitContainer);
+        }
+    }
+    free(ccw);
+    fprintf(fp,"    else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n");
+    fputs("}\n\n",fp);
+}
+
+void
+exportState(TransitionGeneratorPtr tg) {
     StatePtr state = tg->stateList;
     FILE *fp = fopen("state.cc","w");
     if (fp==NULL) {
@@ -13,48 +41,13 @@
         exit(1);
     }
     for (;state;state = state->next) {
-        fprintf(fp,"void state%lx(Buffer buff);\n",state->bitState.bitContainer);
+        fprintf(fp,"TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer);
     }
     fputs("\n",fp);
+    // initial state must not accept empty string
+    generateState1(tg->stateList,0L,false,fp,tg);
     for (state = tg->stateList;state;state = state->next) {
-        fprintf(fp,"void state%lx(Buffer buff) {\n",state->bitState.bitContainer);
-        if (state->bitState.bitContainer == 2) { // Accept
-            fputs("    stateMatch(buff);\n",fp);
-        } else {  // not Accept
-            fputs("    if (buff.buffptr >= buff.buffend) return;\n",fp);
-            fputs("    unsigned char c = *buff.buffptr++;\n",fp);
-            CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
-            bool flag = true;
-            while (hasNext(ccw)) {
-                CharClassPtr cc = getNext(ccw);
-                unsigned long begin = cc->cond.range.begin;
-                unsigned long end = cc->cond.range.end;
-                BitVector bi = cc->nextState;
-                if (flag) {
-                    flag = false;
-                    fputs("    ",fp);
-                } else {
-                    fputs("    else ",fp);
-                }
-                if (begin == end) {
-                    fprintf(fp,"if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer);
-                } else {
-                    if (state->accept) {
-                        fprintf(fp,"if (c<'%c') stateMatch(buff);\n",(unsigned char)begin);
-                    } else {
-                        fprintf(fp,"if (c<'%c') stateSkip(buff);\n",(unsigned char)begin);
-                    }
-                    fprintf(fp,"    else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer);
-                }
-            }
-            free(ccw);
-            if (state->bitState.bitContainer & 2) {
-                fprintf(fp,"    else stateMatch(buff);\n");
-            } else {
-                fprintf(fp,"    else stateSkip(buff);\n");
-            }
-        }
-        fputs("}\n\n",fp);
+        generateState1(state,state->bitState.bitContainer,true,fp,tg);
     }
     fclose(fp);
 }