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
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"
0c28ff35b4f0 add generateSequentialSearch
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
8
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
9 static void
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
10 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
11
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
12 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
13 if (accept && state->accept) {
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
14 fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
15 }
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
16 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
17 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
18 fputs(" if (0) ;\n",fp);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
19 while (hasNext(ccw)) {
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
20 CharClassPtr cc = getNext(ccw);
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
21 unsigned long begin = cc->cond.range.begin;
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
22 unsigned long end = cc->cond.range.end;
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
23 BitVector bi = cc->nextState;
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
24 if (begin == end) {
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
25 fprintf(fp," else if (c=='%c') { tsv.current=(TState*)state%lx;}\n",(unsigned char)begin, bi.bitContainer);
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
26 } else {
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
27 fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);tsv.current=(TState*) state0;}\n",(unsigned char)begin);
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
28 fprintf(fp," else if (c<='%c') { tsv.current=(TState*) state%lx;} \n",(unsigned char)end, bi.bitContainer);
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
29 }
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
30 }
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
31 free(ccw);
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
32 fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); tsv.current=(TState*)state0; }\n return tsv;\n");
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
33 fputs("}\n\n",fp);
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
34 }
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
35
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
36 void
312
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
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
90ccd94906c0 minor fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 312
diff changeset
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
47 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
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
51
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
52 fprintf(fp,
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
53 "\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
54 "static TSValue \n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
55 "stateLoop(TSValue tsv) {\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
56 " tsv.current = (TState*)state0;\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
57 " while(tsv.buff.buffptr < tsv.buff.buffend) {\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
58 " TSValue (*next)(TSValue) = (TSValue (*)(TSValue))tsv.current;\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
59 " tsv = next(tsv);\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
60 " }\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
61 " return tsv;\n"
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
62 "}\n\n" );
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
63
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
64
298
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
65 // initial state must not accept empty string
63213964502a refactoring ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
68 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
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
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
c9ac6f06e706 add loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 308
diff changeset
74