changeset 312:c9ac6f06e706

add loop
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 09 Feb 2016 10:59:22 +0900
parents 1d79e61a9365
children 90ccd94906c0
files regexParser/CeriumGrep.cc regexParser/Makefile regexParser/cerium/Makefile.def regexParser/generateLoop.cc regexParser/generateSequentialSearch.cc regexParser/generateSequentialSearch.h regexParser/generateSequentialSearchCbC.cc regexParser/sequentialSearch.cc regexParser/subsetConstruction.h
diffstat 9 files changed, 116 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/regexParser/CeriumGrep.cc	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/CeriumGrep.cc	Tue Feb 09 10:59:22 2016 +0900
@@ -8,12 +8,13 @@
 #include "grepWalk.h"
 #include "fileread.h"
 #include "threadedSearch.h"
+#include "generateSequentialSearch.h"
 
 Search grep(int argc,char **argv,bool parallel)
 {
     bool generate = true;
     bool subset = false;
-    bool generateSequentialSearch = false;
+    void  (*generateSequentialSearch)(TransitionGeneratorPtr) = NULL;
     bool ts = false;
     char *filename = NULL;
     Search s;
@@ -30,7 +31,11 @@
         } else if (strcmp(argv[i],"-subset") == 0) {
             subset = true;
         } else if (strcmp(argv[i],"-seq") == 0) {
-            generateSequentialSearch = true;
+            generateSequentialSearch = exportState;
+        } else if (strcmp(argv[i],"-loop") == 0) {
+            generateSequentialSearch = exportStateLoop;
+        } else if (strcmp(argv[i],"-cbc") == 0) {
+            generateSequentialSearch = exportStateCbC;
         } else if (strcmp(argv[i],"-file") == 0) {
             s.filename = filename = argv[i+1]; i++;
         } else if (strcmp(argv[i],"-ts") == 0) {
@@ -56,7 +61,7 @@
         subsetConstruction(tgv.tg);   // Determinization
         printState(tgv.tg);
         if (generateSequentialSearch) {
-            exportState(tgv.tg);
+            generateSequentialSearch(tgv.tg);
         }
     }
 
--- a/regexParser/Makefile	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/Makefile	Tue Feb 09 10:59:22 2016 +0900
@@ -7,7 +7,7 @@
 AR= libCeriumGrep.a
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE = sequentialSearch.cc state.cc parallelSearch.cc taskInit.cc searchTask.cc main.cc stateCbC.cc sequentialSearchCbC.cc generateSequentialSearchCbC.cc sequentialSearch.cc generateSequentialSearch.cc 
+SRCS_EXCLUDE = sequentialSearch.cc state.cc parallelSearch.cc taskInit.cc searchTask.cc main.cc stateCbC.cc sequentialSearchCbC.cc 
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
@@ -26,11 +26,8 @@
 
 all: $(TARGET)
 
-regexParser: $(OBJS) main.o sequentialSearch.o generateSequentialSearch.o
-	$(CC) $(CFLAGS) -o $@ $(OBJS) main.o generateSequentialSearch.o
-
-regexParserCbC: $(OBJS) main.o generateSequentialSearchCbC.o
-	$(CbC) $(CFLAGS) -o $@ $(OBJS) main.o generateSequentialSearchCbC.o
+regexParser: $(OBJS) main.o  $(AR)
+	$(CC) $(CFLAGS) -o $@ $(AR) main.o 
 
 test/searchBit: test/searchBit.cc
 	$(CC) $(CFLAGS)  $< bitVector.cc -o $@
@@ -55,7 +52,7 @@
 
 clean:
 	rm -f $(TARGET) $(OBJS) $(AR)
-	rm -rf *~ \#* *.gcda *.gcno *.gcov state.cc  sequentialSearch *.dSYM *.o stateCbC.cc sequentialSearchCbC
+	rm -rf *~ \#* *.gcda *.gcno *.gcov state.cc  sequentialSearch *.dSYM *.o stateCbC.cc sequentialCbC
 	cd test; rm -rf *.o *~ \#* *.gcda *.gcno *.gcov *.dSYM
 	cd cerium; make clean
 	touch state.cc stateCbC.cc
@@ -71,23 +68,27 @@
 test2: regexParser $(TESTFILE)
 	./regexParser $(SUBSET) -regex $(REGEX)-file $(TESTFILE) $(WC)
 
-seqtest: sequentialSearch $(TESTFILE)
-	./sequentialSearch -file $(TESTFILE) $(WC)
-
 grepWalk: regexParser $(TESTFILE)
 	./regexParser $(SUBSET)  -regex $(REGEX) -file $(TESTFILE) $(WC)
 
-sequentialSearch: sequentialSearch.cc regexParser fileread.o
+sequentialSearch: sequentialSearch.cc regexParser $(AR) $(TESTFILE)
 	./regexParser -seq -subset -regex $(REGEX)
 	$(CC) $(SEQCFLAGS)  -c sequentialSearch.cc 
-	$(CC) $(SEQDFLAGS)  sequentialSearch.o  generateSequentialSearch.o $(OBJS) -o $@
-	- ./$@ -file $(TESTFILE)
+	$(CC) $(SEQDFLAGS)  sequentialSearch.o $(AR) -o $@
+	- ./$@ -file $(TESTFILE) $(WC)
 
-sequentialSearchCbC: sequentialSearchCbC.cc regexParserCbC fileread.o $(TESTFILE)
-	./regexParserCbC -seq -subset -regex $(REGEX)
+sequentialLoop: sequentialSearch.cc regexParser $(AR) $(TESTFILE)
+	./regexParser -loop -subset -regex $(REGEX)
+	$(CC) $(SEQCFLAGS)  -c sequentialSearch.cc 
+	$(CC) $(SEQDFLAGS)  sequentialSearch.o $(AR) -o $@
+	- ./$@ -file $(TESTFILE) $(WC)
+
+
+sequentialCbC: sequentialSearchCbC.cc regexParser $(AR) $(TESTFILE)
+	./regexParserCbC -cbc -subset -regex $(REGEX)
 	$(CbC) $(SEQCFLAGS)  -O1 -c sequentialSearchCbC.cc 
-	$(CbC) $(SEQDFLAGS)  sequentialSearchCbC.o generateSequentialSearchCbC.o $(OBJS) -o $@
-	- ./$@ -file $(TESTFILE)
+	$(CbC) $(SEQDFLAGS)  sequentialSearchCbC.o $(AR)  -o $@
+	- ./$@ -file $(TESTFILE) $(WC)
 
 test1: regexParser
 	./regexParser -regex 'a'
--- a/regexParser/cerium/Makefile.def	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/cerium/Makefile.def	Tue Feb 09 10:59:22 2016 +0900
@@ -4,7 +4,7 @@
 
 # ex  linux/ps3
 
-OPT =  -g -O0
+OPT =  -g -O
 
 CC      = clang++
 CFLAGS  =  -I.. -m64 -Wall $(OPT)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/regexParser/generateLoop.cc	Tue Feb 09 10:59:22 2016 +0900
@@ -0,0 +1,75 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "generateSequentialSearch.h"
+#include "CharClass.h"
+#include "subsetConstruction.h"
+
+
+static void
+generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
+
+    fprintf(fp,"static 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') { tsv.current=(TState*)state%lx;}\n",(unsigned char)begin, bi.bitContainer);
+        } else {
+            fprintf(fp,"    else if (c<'%c')  { tsv=tsv.tg->stateSkip(tsv);tsv.current=(TState*) state0;}\n",(unsigned char)begin);
+            fprintf(fp,"    else if (c<='%c') { tsv.current=(TState*) state%lx;} \n",(unsigned char)end,  bi.bitContainer);
+        }
+    }
+    free(ccw);
+    fprintf(fp,"    else { tsv=tsv.tg->stateSkip(tsv); tsv.current=(TState*)state0; }\n    return tsv;\n");
+    fputs("}\n\n",fp);
+} 
+
+void
+exportStateLoop(TransitionGeneratorPtr tg) {
+    StatePtr state = tg->stateList;
+    FILE *fp = fopen("state.cc","w");
+    if (fp==NULL) {
+        perror("");
+        fprintf(stderr,"cannot write state.cc\n");
+        exit(1);
+    }
+    fprintf(fp,"static TSValue state%lx(TSValue tsv) ;\n",0);
+    for (;state;state = state->next) {
+        if (state->bitState.bitContainer!=1)  // state1 always unused but state0
+            fprintf(fp,"static TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer);
+    }
+    fputs("\n",fp);
+
+    fprintf(fp,
+"\n"
+"static TSValue \n"
+"stateLoop(TSValue tsv) {\n"
+"    tsv.current = (TState*)state0;\n"
+"    while(tsv.buff.buffptr < tsv.buff.buffend) {\n"
+"        TSValue (*next)(TSValue) = (TSValue (*)(TSValue))tsv.current;\n"
+"        tsv = next(tsv);\n"
+"    }\n"
+"    return tsv;\n"
+"}\n\n" );
+
+
+    // initial state must not accept empty string
+    generateState1(tg->stateList,0L,false,fp,tg);
+    for (state = tg->stateList;state;state = state->next) {
+        if (state->bitState.bitContainer!=1)  // state1 always unused but state0
+            generateState1(state,state->bitState.bitContainer,true,fp,tg);
+    }
+    fprintf(fp,"#define state0 stateLoop\n");
+    fclose(fp);
+}
+
--- a/regexParser/generateSequentialSearch.cc	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/generateSequentialSearch.cc	Tue Feb 09 10:59:22 2016 +0900
@@ -5,9 +5,9 @@
 #include "CharClass.h"
 #include "subsetConstruction.h"
 
-void
+static void
 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
-    fprintf(fp,"TSValue state%lx(TSValue tsv) {\n",stateNum);
+    fprintf(fp,"static TSValue state%lx(TSValue tsv) {\n",stateNum);
     if (accept && state->accept) {
         fputs("    tsv=tsv.tg->stateMatch(tsv);\n",fp);
     }
@@ -30,7 +30,7 @@
     free(ccw);
     fprintf(fp,"    else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n");
     fputs("}\n\n",fp);
-}
+} 
 
 void
 exportState(TransitionGeneratorPtr tg) {
@@ -42,13 +42,17 @@
         exit(1);
     }
     for (;state;state = state->next) {
-        fprintf(fp,"TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer);
+        if (state->bitState.bitContainer!=1)  // state1 always unused but state0
+            fprintf(fp,"static 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) {
-        generateState1(state,state->bitState.bitContainer,true,fp,tg);
+        if (state->bitState.bitContainer!=1)  // state1 always unused but state0
+            generateState1(state,state->bitState.bitContainer,true,fp,tg);
     }
     fclose(fp);
 }
+
+
--- a/regexParser/generateSequentialSearch.h	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/generateSequentialSearch.h	Tue Feb 09 10:59:22 2016 +0900
@@ -1,3 +1,5 @@
 #include "regexParser.h"
 
 extern void exportState(TransitionGeneratorPtr tg);
+extern void exportStateLoop(TransitionGeneratorPtr tg);
+extern void exportStateCbC(TransitionGeneratorPtr tg);
--- a/regexParser/generateSequentialSearchCbC.cc	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/generateSequentialSearchCbC.cc	Tue Feb 09 10:59:22 2016 +0900
@@ -5,7 +5,7 @@
 #include "subsetConstruction.h"
 #include "CharClass.h"
 
-void
+static void
 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
     fprintf(fp,"__code state%lx(TSValue tsv) {\n",stateNum);
     if (accept && state->accept) {
@@ -33,7 +33,7 @@
 }
 
 void
-exportState(TransitionGeneratorPtr tg) {
+exportStateCbC(TransitionGeneratorPtr tg) {
     StatePtr state = tg->stateList;
     FILE *fp = fopen("stateCbC.cc","w");
     if (fp==NULL) {
--- a/regexParser/sequentialSearch.cc	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/sequentialSearch.cc	Tue Feb 09 10:59:22 2016 +0900
@@ -7,10 +7,8 @@
 
 #include "fileread.h"
 #include "threadedSearch.h"
+#include "state.cc"
 
-TSValue state0(TSValue ts);
-
-#include "state.cc"
 int main(int argc, char **argv) {
     char *filename;
     for (int i = 1; i < argc; i++) {
--- a/regexParser/subsetConstruction.h	Mon Feb 08 22:12:14 2016 +0900
+++ b/regexParser/subsetConstruction.h	Tue Feb 09 10:59:22 2016 +0900
@@ -1,5 +1,4 @@
 extern TGValue createTGValue();
-extern void exportState(TransitionGeneratorPtr tg);
 extern void setState(CharClassPtr cc, BitVector bi);
 extern StatePtr createState(TGValue tgv,NodePtr n);
 extern StatePtr createState(TransitionGeneratorPtr tg,BitVector bi);