Mercurial > hg > Applications > Grep
comparison regexParser/generateSequentialSearch.cc @ 225:0c28ff35b4f0
add generateSequentialSearch
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 15 Jan 2016 16:47:03 +0900 |
parents | |
children | b4022ba23de5 |
comparison
equal
deleted
inserted
replaced
224:474fc9f844db | 225:0c28ff35b4f0 |
---|---|
1 #include <stdio.h> | |
2 | |
3 #include "generateSequentialSearch.h" | |
4 #include "subsetConstruction.h" | |
5 | |
6 void exportState(TransitionGeneratorPtr tg) { | |
7 StatePtr state = tg->stateList; | |
8 FILE *fp = fopen("state.cc","w"); | |
9 fputs("unsigned char *buff, *buffptr, buffend;\n",fp); | |
10 fputs( | |
11 "void stateSkip() {\n" | |
12 " matchBegin = buffptr;\n" | |
13 " state1();\n" | |
14 "}\n" | |
15 "\n" | |
16 "void stateMatch() {\n" | |
17 " fwrite(matchBegin,buffptr-matchBegin,1,fp);\n" | |
18 " fputs(\"\\n\");\n" | |
19 " stateSkip();\n" | |
20 "}\n" | |
21 ,fp); | |
22 for (;state;state = state->next) { | |
23 fprintf(fp,"void state%lx();\n",state->bitState.bitContainer); | |
24 } | |
25 fputs("\n",fp); | |
26 for (;state;state = state->next) { | |
27 fprintf(fp,"void state%lx() {\n",state->bitState.bitContainer); | |
28 if (state->bitState.bitContainer == 2) { // Accept | |
29 fputs(" // Accept\n",fp); | |
30 } else { // not Accept | |
31 fputs(" unsigned char c = *buffptr++;\n",fp); | |
32 CharClassWalkerPtr ccw = createCharClassWalker(state->cc); | |
33 bool flag = true; | |
34 while (hasNext(ccw)) { | |
35 CharClassPtr cc = getNext(ccw); | |
36 unsigned long begin = cc->cond.range.begin; | |
37 unsigned long end = cc->cond.range.end; | |
38 BitVector bi = cc->nextState; | |
39 if (flag) { | |
40 flag = false; | |
41 } else { | |
42 fputs(" else ",fp); | |
43 } | |
44 if (begin == end) { | |
45 fprintf(fp," if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer); | |
46 } else { | |
47 fprintf(fp," if (c<'%c') state1();\n",(unsigned char)begin); | |
48 fprintf(fp," else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer); | |
49 } | |
50 } | |
51 if (state->bitState.bitContainer == 2) { | |
52 fprintf(fp," else stateMatch();\n"); | |
53 } else { | |
54 fprintf(fp," else stateSkip();\n"); | |
55 } | |
56 } | |
57 fputs("}\n\n",fp); | |
58 } | |
59 fclose(fp); | |
60 } |