changeset 227:8be58af605da

fix getNext()
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Fri, 15 Jan 2016 19:11:35 +0900
parents b4022ba23de5
children 399380ad95b7
files regexParser/Makefile regexParser/generateSequentialSearch.cc regexParser/sequentialSearch.cc regexParser/subsetConstruction.cc
diffstat 4 files changed, 38 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/regexParser/Makefile	Fri Jan 15 17:53:11 2016 +0900
+++ b/regexParser/Makefile	Fri Jan 15 19:11:35 2016 +0900
@@ -3,10 +3,12 @@
 CC= clang++
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE = 
+SRCS_EXCLUDE = sequentialSearch.cc
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
+REGEX = '[A-Z][A-Za-z0-9_]*'
+
 .cc.o:
 	$(CC) $(CFLAGS) -c $< -o $@
 
@@ -21,6 +23,11 @@
 test/ccMerge: test/ccMerge.cc
 	$(CC) $(CFLAGS) -I. $< subsetConstruction.cc regexParser.cc node.cc error.cc bitVector.cc -o $@
 
+sequentialSearch: sequentialSearch.cc regexParser
+	./regexParser -subset -regex $(REGEX)
+	$(CC) $(CFLAGS) -I. sequentialSearch.cc -o $@
+	
+
 gcov:
 	make CFLAGS="-Wall -O0 -g -coverage"
 	make test1
@@ -30,6 +37,7 @@
 clean:
 	rm -f $(TARGET) $(OBJS)
 	rm -f *~ \#* *.gcda *.gcno *.gcov state.cc
+	touch state.cc
 
 .SUFFIXES: .cc .o
 
--- a/regexParser/generateSequentialSearch.cc	Fri Jan 15 17:53:11 2016 +0900
+++ b/regexParser/generateSequentialSearch.cc	Fri Jan 15 19:11:35 2016 +0900
@@ -7,21 +7,8 @@
     StatePtr state = tg->stateList;
     FILE *fp = fopen("state.cc","w");
     for (;state;state = state->next) {
-        fprintf(fp,"void state%lx();\n",state->bitState.bitContainer);
+        fprintf(fp,"void state%lx(BufferList buff);\n",state->bitState.bitContainer);
     }
-
-    fputs(
-"void stateSkip(BufferList buff) {\n"
-"    buff.matchBegin = buff.buffptr;\n"
-"    state1(buff);\n"
-"}\n"
-"\n"
-"void stateMatch(BufferList buff) {\n"
-"    fwrite(buff.matchBegin,buff.buffptr-buff.matchBegin,1,stdout);\n"
-"    puts(\"\\n\");\n"
-"    stateSkip(buff);\n"
-"}\n"
-        ,fp);
     fputs("\n",fp);
     for (state = tg->stateList;state;state = state->next) {
         fprintf(fp,"void state%lx(BufferList buff) {\n",state->bitState.bitContainer);
@@ -29,7 +16,7 @@
             fputs("    stateMatch(buff);\n",fp);
         } else {  // not Accept
             fputs("    if (buff.buffptr >= buff.buffend) return;\n",fp);
-            fputs("    unsigned char c = *buffptr++;\n",fp);
+            fputs("    unsigned char c = *buff.buffptr++;\n",fp);
             CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
             bool flag = true;
             while (hasNext(ccw)) {
@@ -39,13 +26,14 @@
                 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);
+                    fprintf(fp,"if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer);
                 } else {
-                    fprintf(fp,"    if (c<'%c') stateSkip(buff);\n",(unsigned char)begin);
+                    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);
                 }
             }
--- a/regexParser/sequentialSearch.cc	Fri Jan 15 17:53:11 2016 +0900
+++ b/regexParser/sequentialSearch.cc	Fri Jan 15 19:11:35 2016 +0900
@@ -7,10 +7,10 @@
 #include <sys/types.h>
 
 typedef struct bufferList {
-    unsigned char buff;
-    unsigned char buffptr;
-    unsigned char buffend;
-    unsigned char matchBegin;
+    unsigned char *buff;
+    unsigned char *buffptr;
+    unsigned char *buffend;
+    unsigned char *matchBegin;
 } BufferList, *BufferListPtr;
 
 typedef struct {
@@ -18,6 +18,19 @@
     off_t size;
 } st_mmap_t;
 
+void state1(BufferList buff);
+
+void stateSkip(BufferList buff) {
+    buff.matchBegin = buff.buffptr;
+    state1(buff);
+}
+
+void stateMatch(BufferList buff) {
+    fwrite(buff.matchBegin,buff.buffptr-buff.matchBegin,1,stdout);
+    puts("\n");
+    stateSkip(buff);
+}
+
 #include "state.cc"
 int main(int argc, char **argv) {
     char *filename;
@@ -32,14 +45,20 @@
     struct stat sb;
     int fd;
     if ((fd=open(filename,O_RDONLY,0666))==0) {
+        perror("");
         fprintf(stderr,"can't open %s\n",filename);
     }
 
     if (fstat(fd,&sb)) {
+        perror("");
         fprintf(stderr,"can't fstat %s\n",filename);
     }
     st_mmap.size = sb.st_size;
-    unsigned char *file_mmap = mmap(NULL,st_mmap.size,PROT_WRITE|PROT_READ,map,fd,(off_t)0);
+    unsigned char *file_mmap = (unsigned char*)mmap(NULL,st_mmap.size,PROT_WRITE|PROT_READ,map,fd,(off_t)0);
+    if (file_mmap == NULL) {
+        perror("");
+        fprintf(stderr,"cannot mmap %s\n",filename);
+    }
 
     BufferList buff;
     buff.buff = buff.buffptr = buff.matchBegin = file_mmap;
--- a/regexParser/subsetConstruction.cc	Fri Jan 15 17:53:11 2016 +0900
+++ b/regexParser/subsetConstruction.cc	Fri Jan 15 19:11:35 2016 +0900
@@ -159,7 +159,6 @@
             return current;
         }
     } 
-    walk->next = NULL;
     return current;
 }