comparison 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
comparison
equal deleted inserted replaced
297:c5a7caa37f61 298:63213964502a
2 #include <stdlib.h> 2 #include <stdlib.h>
3 3
4 #include "generateSequentialSearch.h" 4 #include "generateSequentialSearch.h"
5 #include "subsetConstruction.h" 5 #include "subsetConstruction.h"
6 6
7 void exportState(TransitionGeneratorPtr tg) { 7 void
8 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
9 fprintf(fp,"TSValue state%lx(TSValue tsv) {\n",stateNum);
10 if (accept && state->accept) {
11 fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp);
12 }
13 fputs(" if (tsv.buff.buffptr >= tsv.buff.buffend) return tsv;\n",fp);
14 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
15 if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp);
16 fputs(" if (0) ;\n",fp);
17 while (hasNext(ccw)) {
18 CharClassPtr cc = getNext(ccw);
19 unsigned long begin = cc->cond.range.begin;
20 unsigned long end = cc->cond.range.end;
21 BitVector bi = cc->nextState;
22 if (begin == end) {
23 fprintf(fp," else if (c=='%c') { return state%lx(tsv);}\n",(unsigned char)begin, bi.bitContainer);
24 } else {
25 fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);return state0(tsv);}\n",(unsigned char)begin);
26 fprintf(fp," else if (c<='%c') { return state%lx(tsv);} \n",(unsigned char)end, bi.bitContainer);
27 }
28 }
29 free(ccw);
30 fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n");
31 fputs("}\n\n",fp);
32 }
33
34 void
35 exportState(TransitionGeneratorPtr tg) {
8 StatePtr state = tg->stateList; 36 StatePtr state = tg->stateList;
9 FILE *fp = fopen("state.cc","w"); 37 FILE *fp = fopen("state.cc","w");
10 if (fp==NULL) { 38 if (fp==NULL) {
11 perror(""); 39 perror("");
12 fprintf(stderr,"cannot write state.cc\n"); 40 fprintf(stderr,"cannot write state.cc\n");
13 exit(1); 41 exit(1);
14 } 42 }
15 for (;state;state = state->next) { 43 for (;state;state = state->next) {
16 fprintf(fp,"void state%lx(Buffer buff);\n",state->bitState.bitContainer); 44 fprintf(fp,"TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer);
17 } 45 }
18 fputs("\n",fp); 46 fputs("\n",fp);
47 // initial state must not accept empty string
48 generateState1(tg->stateList,0L,false,fp,tg);
19 for (state = tg->stateList;state;state = state->next) { 49 for (state = tg->stateList;state;state = state->next) {
20 fprintf(fp,"void state%lx(Buffer buff) {\n",state->bitState.bitContainer); 50 generateState1(state,state->bitState.bitContainer,true,fp,tg);
21 if (state->bitState.bitContainer == 2) { // Accept
22 fputs(" stateMatch(buff);\n",fp);
23 } else { // not Accept
24 fputs(" if (buff.buffptr >= buff.buffend) return;\n",fp);
25 fputs(" unsigned char c = *buff.buffptr++;\n",fp);
26 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
27 bool flag = true;
28 while (hasNext(ccw)) {
29 CharClassPtr cc = getNext(ccw);
30 unsigned long begin = cc->cond.range.begin;
31 unsigned long end = cc->cond.range.end;
32 BitVector bi = cc->nextState;
33 if (flag) {
34 flag = false;
35 fputs(" ",fp);
36 } else {
37 fputs(" else ",fp);
38 }
39 if (begin == end) {
40 fprintf(fp,"if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer);
41 } else {
42 if (state->accept) {
43 fprintf(fp,"if (c<'%c') stateMatch(buff);\n",(unsigned char)begin);
44 } else {
45 fprintf(fp,"if (c<'%c') stateSkip(buff);\n",(unsigned char)begin);
46 }
47 fprintf(fp," else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer);
48 }
49 }
50 free(ccw);
51 if (state->bitState.bitContainer & 2) {
52 fprintf(fp," else stateMatch(buff);\n");
53 } else {
54 fprintf(fp," else stateSkip(buff);\n");
55 }
56 }
57 fputs("}\n\n",fp);
58 } 51 }
59 fclose(fp); 52 fclose(fp);
60 } 53 }