Mercurial > hg > Applications > Grep
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"); |