Mercurial > hg > Applications > Grep
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 } |