comparison regexParser/generateSequentialSearch.cc @ 227:8be58af605da

fix getNext()
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Fri, 15 Jan 2016 19:11:35 +0900
parents b4022ba23de5
children 2081b9d6a179
comparison
equal deleted inserted replaced
226:b4022ba23de5 227:8be58af605da
5 5
6 void exportState(TransitionGeneratorPtr tg) { 6 void exportState(TransitionGeneratorPtr tg) {
7 StatePtr state = tg->stateList; 7 StatePtr state = tg->stateList;
8 FILE *fp = fopen("state.cc","w"); 8 FILE *fp = fopen("state.cc","w");
9 for (;state;state = state->next) { 9 for (;state;state = state->next) {
10 fprintf(fp,"void state%lx();\n",state->bitState.bitContainer); 10 fprintf(fp,"void state%lx(BufferList buff);\n",state->bitState.bitContainer);
11 } 11 }
12
13 fputs(
14 "void stateSkip(BufferList buff) {\n"
15 " buff.matchBegin = buff.buffptr;\n"
16 " state1(buff);\n"
17 "}\n"
18 "\n"
19 "void stateMatch(BufferList buff) {\n"
20 " fwrite(buff.matchBegin,buff.buffptr-buff.matchBegin,1,stdout);\n"
21 " puts(\"\\n\");\n"
22 " stateSkip(buff);\n"
23 "}\n"
24 ,fp);
25 fputs("\n",fp); 12 fputs("\n",fp);
26 for (state = tg->stateList;state;state = state->next) { 13 for (state = tg->stateList;state;state = state->next) {
27 fprintf(fp,"void state%lx(BufferList buff) {\n",state->bitState.bitContainer); 14 fprintf(fp,"void state%lx(BufferList buff) {\n",state->bitState.bitContainer);
28 if (state->bitState.bitContainer == 2) { // Accept 15 if (state->bitState.bitContainer == 2) { // Accept
29 fputs(" stateMatch(buff);\n",fp); 16 fputs(" stateMatch(buff);\n",fp);
30 } else { // not Accept 17 } else { // not Accept
31 fputs(" if (buff.buffptr >= buff.buffend) return;\n",fp); 18 fputs(" if (buff.buffptr >= buff.buffend) return;\n",fp);
32 fputs(" unsigned char c = *buffptr++;\n",fp); 19 fputs(" unsigned char c = *buff.buffptr++;\n",fp);
33 CharClassWalkerPtr ccw = createCharClassWalker(state->cc); 20 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
34 bool flag = true; 21 bool flag = true;
35 while (hasNext(ccw)) { 22 while (hasNext(ccw)) {
36 CharClassPtr cc = getNext(ccw); 23 CharClassPtr cc = getNext(ccw);
37 unsigned long begin = cc->cond.range.begin; 24 unsigned long begin = cc->cond.range.begin;
38 unsigned long end = cc->cond.range.end; 25 unsigned long end = cc->cond.range.end;
39 BitVector bi = cc->nextState; 26 BitVector bi = cc->nextState;
40 if (flag) { 27 if (flag) {
41 flag = false; 28 flag = false;
29 fputs(" ",fp);
42 } else { 30 } else {
43 fputs(" else ",fp); 31 fputs(" else ",fp);
44 } 32 }
45 if (begin == end) { 33 if (begin == end) {
46 fprintf(fp," if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer); 34 fprintf(fp,"if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer);
47 } else { 35 } else {
48 fprintf(fp," if (c<'%c') stateSkip(buff);\n",(unsigned char)begin); 36 fprintf(fp,"if (c<'%c') stateSkip(buff);\n",(unsigned char)begin);
49 fprintf(fp," else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer); 37 fprintf(fp," else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer);
50 } 38 }
51 } 39 }
52 if (state->bitState.bitContainer == 2) { 40 if (state->bitState.bitContainer == 2) {
53 fprintf(fp," else stateMatch(buff);\n"); 41 fprintf(fp," else stateMatch(buff);\n");