annotate regexParser/generateSequentialSearchCbC.cc @ 301:4cb6eea3ab12

add CbC version
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Thu, 04 Feb 2016 03:26:18 +0900
parents
children 1d79e61a9365
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
301
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #include <stdio.h>
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #include <stdlib.h>
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include "generateSequentialSearch.h"
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #include "subsetConstruction.h"
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 void
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 fprintf(fp,"__code state%lx(TSValue tsv) {\n",stateNum);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 if (accept && state->accept) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 fputs(" if (tsv.buff.buffptr >= tsv.buff.buffend) _exit(0);\n",fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 fputs(" if (0) ;\n",fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 while (hasNext(ccw)) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 CharClassPtr cc = getNext(ccw);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 unsigned long begin = cc->cond.range.begin;
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 unsigned long end = cc->cond.range.end;
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 BitVector bi = cc->nextState;
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 if (begin == end) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 fprintf(fp," else if (c=='%c') { goto state%lx(tsv);}\n",(unsigned char)begin, bi.bitContainer);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 } else {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);goto state0(tsv);}\n",(unsigned char)begin);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 fprintf(fp," else if (c<='%c') { goto state%lx(tsv);} \n",(unsigned char)end, bi.bitContainer);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 free(ccw);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); goto state0(tsv);}\n");
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 fputs("}\n\n",fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 void
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 exportState(TransitionGeneratorPtr tg) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 StatePtr state = tg->stateList;
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 FILE *fp = fopen("stateCbC.cc","w");
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 if (fp==NULL) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 perror("");
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 fprintf(stderr,"cannot write stateCbC.cc\n");
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 exit(1);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 for (;state;state = state->next) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 fprintf(fp,"__code state%lx(TSValue tsv);\n",state->bitState.bitContainer);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 fputs("\n",fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 // initial state must not accept empty string
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 generateState1(tg->stateList,0L,false,fp,tg);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 for (state = tg->stateList;state;state = state->next) {
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 generateState1(state,state->bitState.bitContainer,true,fp,tg);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 }
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 fclose(fp);
4cb6eea3ab12 add CbC version
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 }