Mercurial > hg > Applications > Grep
annotate regexParser/generateLoop.cc @ 313:90ccd94906c0
minor fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 09 Feb 2016 11:02:35 +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" |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 |
312 | 8 |
9 static void | |
298 | 10 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) { |
312 | 11 |
12 fprintf(fp,"static TSValue state%lx(TSValue tsv) {\n",stateNum); | |
298 | 13 if (accept && state->accept) { |
14 fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp); | |
15 } | |
16 CharClassWalkerPtr ccw = createCharClassWalker(state->cc); | |
17 if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp); | |
18 fputs(" if (0) ;\n",fp); | |
19 while (hasNext(ccw)) { | |
20 CharClassPtr cc = getNext(ccw); | |
21 unsigned long begin = cc->cond.range.begin; | |
22 unsigned long end = cc->cond.range.end; | |
23 BitVector bi = cc->nextState; | |
24 if (begin == end) { | |
312 | 25 fprintf(fp," else if (c=='%c') { tsv.current=(TState*)state%lx;}\n",(unsigned char)begin, bi.bitContainer); |
298 | 26 } else { |
312 | 27 fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);tsv.current=(TState*) state0;}\n",(unsigned char)begin); |
28 fprintf(fp," else if (c<='%c') { tsv.current=(TState*) state%lx;} \n",(unsigned char)end, bi.bitContainer); | |
298 | 29 } |
30 } | |
31 free(ccw); | |
312 | 32 fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); tsv.current=(TState*)state0; }\n return tsv;\n"); |
298 | 33 fputs("}\n\n",fp); |
312 | 34 } |
298 | 35 |
36 void | |
312 | 37 exportStateLoop(TransitionGeneratorPtr tg) { |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 StatePtr state = tg->stateList; |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 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
|
40 if (fp==NULL) { |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
41 perror(""); |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
42 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
|
43 exit(1); |
87ad91af8a15
turn initialization in charclasswalk
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
230
diff
changeset
|
44 } |
313 | 45 fprintf(fp,"static TSValue state%lx(TSValue tsv) ;\n",0L); |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 for (;state;state = state->next) { |
312 | 47 if (state->bitState.bitContainer!=1) // state1 always unused but state0 |
48 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
|
49 } |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 fputs("\n",fp); |
312 | 51 |
52 fprintf(fp, | |
53 "\n" | |
54 "static TSValue \n" | |
55 "stateLoop(TSValue tsv) {\n" | |
56 " tsv.current = (TState*)state0;\n" | |
57 " while(tsv.buff.buffptr < tsv.buff.buffend) {\n" | |
58 " TSValue (*next)(TSValue) = (TSValue (*)(TSValue))tsv.current;\n" | |
59 " tsv = next(tsv);\n" | |
60 " }\n" | |
61 " return tsv;\n" | |
62 "}\n\n" ); | |
63 | |
64 | |
298 | 65 // initial state must not accept empty string |
66 generateState1(tg->stateList,0L,false,fp,tg); | |
226
b4022ba23de5
add sequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
225
diff
changeset
|
67 for (state = tg->stateList;state;state = state->next) { |
312 | 68 if (state->bitState.bitContainer!=1) // state1 always unused but state0 |
69 generateState1(state,state->bitState.bitContainer,true,fp,tg); | |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 } |
312 | 71 fprintf(fp,"#define state0 stateLoop\n"); |
225
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 fclose(fp); |
0c28ff35b4f0
add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 } |
312 | 74 |