Mercurial > hg > Applications > Grep
annotate regexParser/generateSequentialSearch.cc @ 324:879dc5d1cb6a default tip
fix
author | mir3636 |
---|---|
date | Fri, 27 May 2016 21:21:09 +0900 |
parents | c9ac6f06e706 |
children |
rev | line source |
---|---|
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include <stdio.h> |
241
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
2 #include <stdlib.h> |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include "generateSequentialSearch.h" |
308 | 5 #include "CharClass.h" |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 #include "subsetConstruction.h" |
324 | 7 #include "bmSearch.h" |
8 | |
9 static void | |
10 wordMatch(const char* cond,FILE* fp,unsigned long begin,CharClassPtr cc,BitVector bi) { | |
11 fprintf(fp," else if (c%s'%c') { \n",cond,(unsigned char)begin); | |
12 WordPtr w; | |
13 for (w = &cc->cond.w;w;w = w->next) { | |
14 // match the word. | |
15 fprintf(fp," if (strncmp(\"%s\",(const char *)tsv.buff.buffptr-1,%d)==0) { tsv.buff.buffptr += %d;return state%lx(tsv);}\n",(const char *)w->word,w->length,w->length - 1,bi.bitContainer); | |
16 } | |
17 fprintf(fp," tsv=tsv.tg->stateSkip(tsv);return state0(tsv);;\n } \n"); | |
18 } | |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 |
312 | 20 static void |
298 | 21 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) { |
312 | 22 fprintf(fp,"static TSValue state%lx(TSValue tsv) {\n",stateNum); |
298 | 23 if (accept && state->accept) { |
24 fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp); | |
25 } | |
26 fputs(" if (tsv.buff.buffptr >= tsv.buff.buffend) return tsv;\n",fp); | |
27 CharClassWalkerPtr ccw = createCharClassWalker(state->cc); | |
28 if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp); | |
29 fputs(" if (0) ;\n",fp); | |
30 while (hasNext(ccw)) { | |
31 CharClassPtr cc = getNext(ccw); | |
32 unsigned long begin = cc->cond.range.begin; | |
33 unsigned long end = cc->cond.range.end; | |
34 BitVector bi = cc->nextState; | |
35 if (begin == end) { | |
324 | 36 if (cc->cond.w.word) { |
37 wordMatch("==",fp,begin,cc,bi); | |
38 } else { | |
39 fprintf(fp," else if (c=='%c') { return state%lx(tsv);}\n",(unsigned char)begin, bi.bitContainer); | |
40 } | |
298 | 41 } else { |
42 fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);return state0(tsv);}\n",(unsigned char)begin); | |
324 | 43 if (cc->cond.w.word) { |
44 wordMatch("<=",fp,begin,cc,bi); | |
45 } else { | |
46 fprintf(fp," else if (c<='%c') { return state%lx(tsv);} \n",(unsigned char)end, bi.bitContainer); | |
47 } | |
298 | 48 } |
49 } | |
50 free(ccw); | |
51 fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n"); | |
52 fputs("}\n\n",fp); | |
312 | 53 } |
298 | 54 |
55 void | |
56 exportState(TransitionGeneratorPtr tg) { | |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 StatePtr state = tg->stateList; |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 FILE *fp = fopen("state.cc","w"); |
241
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
59 if (fp==NULL) { |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
60 perror(""); |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
61 fprintf(stderr,"cannot write state.cc\n"); |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
62 exit(1); |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
63 } |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 for (;state;state = state->next) { |
312 | 65 if (state->bitState.bitContainer!=1) // state1 always unused but state0 |
66 fprintf(fp,"static TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer); | |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 } |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 fputs("\n",fp); |
298 | 69 // initial state must not accept empty string |
70 generateState1(tg->stateList,0L,false,fp,tg); | |
226
b4022ba23de5
add sequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
225
diff
changeset
|
71 for (state = tg->stateList;state;state = state->next) { |
312 | 72 if (state->bitState.bitContainer!=1) // state1 always unused but state0 |
73 generateState1(state,state->bitState.bitContainer,true,fp,tg); | |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 } |
324 | 75 checkBMSearch(tg->stateStart->cc); |
76 tsv.current = generateTState(tg->stateStart,tg); | |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 fclose(fp); |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 } |
312 | 79 |
80 |