annotate regexParser/generateSequentialSearch.cc @ 324:879dc5d1cb6a default tip

fix
author mir3636
date Fri, 27 May 2016 21:21:09 +0900
parents c9ac6f06e706
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1188debbef10 separate CharClass
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 298
diff changeset
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
mir3636
parents: 312
diff changeset
7 #include "bmSearch.h"
mir3636
parents: 312
diff changeset
8
mir3636
parents: 312
diff changeset
9 static void
mir3636
parents: 312
diff changeset
10 wordMatch(const char* cond,FILE* fp,unsigned long begin,CharClassPtr cc,BitVector bi) {
mir3636
parents: 312
diff changeset
11 fprintf(fp," else if (c%s'%c') { \n",cond,(unsigned char)begin);
mir3636
parents: 312
diff changeset
12 WordPtr w;
mir3636
parents: 312
diff changeset
13 for (w = &cc->cond.w;w;w = w->next) {
mir3636
parents: 312
diff changeset
14 // match the word.
mir3636
parents: 312
diff changeset
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);
mir3636
parents: 312
diff changeset
16 }
mir3636
parents: 312
diff changeset
17 fprintf(fp," tsv=tsv.tg->stateSkip(tsv);return state0(tsv);;\n } \n");
mir3636
parents: 312
diff changeset
18 }
225
0c28ff35b4f0 add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
20 static void
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
21 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
22 fprintf(fp,"static TSValue state%lx(TSValue tsv) {\n",stateNum);
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
23 if (accept && state->accept) {
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
24 fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
25 }
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
26 fputs(" if (tsv.buff.buffptr >= tsv.buff.buffend) return tsv;\n",fp);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
27 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
28 if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
29 fputs(" if (0) ;\n",fp);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
30 while (hasNext(ccw)) {
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
31 CharClassPtr cc = getNext(ccw);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
32 unsigned long begin = cc->cond.range.begin;
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
33 unsigned long end = cc->cond.range.end;
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
34 BitVector bi = cc->nextState;
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
35 if (begin == end) {
324
mir3636
parents: 312
diff changeset
36 if (cc->cond.w.word) {
mir3636
parents: 312
diff changeset
37 wordMatch("==",fp,begin,cc,bi);
mir3636
parents: 312
diff changeset
38 } else {
mir3636
parents: 312
diff changeset
39 fprintf(fp," else if (c=='%c') { return state%lx(tsv);}\n",(unsigned char)begin, bi.bitContainer);
mir3636
parents: 312
diff changeset
40 }
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
41 } else {
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
42 fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);return state0(tsv);}\n",(unsigned char)begin);
324
mir3636
parents: 312
diff changeset
43 if (cc->cond.w.word) {
mir3636
parents: 312
diff changeset
44 wordMatch("<=",fp,begin,cc,bi);
mir3636
parents: 312
diff changeset
45 } else {
mir3636
parents: 312
diff changeset
46 fprintf(fp," else if (c<='%c') { return state%lx(tsv);} \n",(unsigned char)end, bi.bitContainer);
mir3636
parents: 312
diff changeset
47 }
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
48 }
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
49 }
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
50 free(ccw);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
51 fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n");
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
52 fputs("}\n\n",fp);
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
53 }
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
54
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
55 void
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
65 if (state->bitState.bitContainer!=1) // state1 always unused but state0
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
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
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
69 // initial state must not accept empty string
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
72 if (state->bitState.bitContainer!=1) // state1 always unused but state0
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
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
mir3636
parents: 312
diff changeset
75 checkBMSearch(tg->stateStart->cc);
mir3636
parents: 312
diff changeset
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
79
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
80