Mercurial > hg > Applications > Grep
diff regexParser/generateSequentialSearch.cc @ 298:63213964502a
refactoring ....
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 03 Feb 2016 12:24:34 +0900 |
parents | f2491681914e |
children | 1188debbef10 |
line wrap: on
line diff
--- a/regexParser/generateSequentialSearch.cc Tue Feb 02 11:58:59 2016 +0900 +++ b/regexParser/generateSequentialSearch.cc Wed Feb 03 12:24:34 2016 +0900 @@ -4,7 +4,35 @@ #include "generateSequentialSearch.h" #include "subsetConstruction.h" -void exportState(TransitionGeneratorPtr tg) { +void +generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) { + fprintf(fp,"TSValue state%lx(TSValue tsv) {\n",stateNum); + if (accept && state->accept) { + fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp); + } + fputs(" if (tsv.buff.buffptr >= tsv.buff.buffend) return tsv;\n",fp); + CharClassWalkerPtr ccw = createCharClassWalker(state->cc); + if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp); + fputs(" if (0) ;\n",fp); + while (hasNext(ccw)) { + CharClassPtr cc = getNext(ccw); + unsigned long begin = cc->cond.range.begin; + unsigned long end = cc->cond.range.end; + BitVector bi = cc->nextState; + if (begin == end) { + fprintf(fp," else if (c=='%c') { return state%lx(tsv);}\n",(unsigned char)begin, bi.bitContainer); + } else { + fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);return state0(tsv);}\n",(unsigned char)begin); + fprintf(fp," else if (c<='%c') { return state%lx(tsv);} \n",(unsigned char)end, bi.bitContainer); + } + } + free(ccw); + fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n"); + fputs("}\n\n",fp); +} + +void +exportState(TransitionGeneratorPtr tg) { StatePtr state = tg->stateList; FILE *fp = fopen("state.cc","w"); if (fp==NULL) { @@ -13,48 +41,13 @@ exit(1); } for (;state;state = state->next) { - fprintf(fp,"void state%lx(Buffer buff);\n",state->bitState.bitContainer); + fprintf(fp,"TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer); } fputs("\n",fp); + // initial state must not accept empty string + generateState1(tg->stateList,0L,false,fp,tg); for (state = tg->stateList;state;state = state->next) { - fprintf(fp,"void state%lx(Buffer buff) {\n",state->bitState.bitContainer); - if (state->bitState.bitContainer == 2) { // Accept - fputs(" stateMatch(buff);\n",fp); - } else { // not Accept - fputs(" if (buff.buffptr >= buff.buffend) return;\n",fp); - fputs(" unsigned char c = *buff.buffptr++;\n",fp); - CharClassWalkerPtr ccw = createCharClassWalker(state->cc); - bool flag = true; - while (hasNext(ccw)) { - CharClassPtr cc = getNext(ccw); - unsigned long begin = cc->cond.range.begin; - unsigned long end = cc->cond.range.end; - BitVector bi = cc->nextState; - if (flag) { - flag = false; - fputs(" ",fp); - } else { - fputs(" else ",fp); - } - if (begin == end) { - fprintf(fp,"if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer); - } else { - if (state->accept) { - fprintf(fp,"if (c<'%c') stateMatch(buff);\n",(unsigned char)begin); - } else { - fprintf(fp,"if (c<'%c') stateSkip(buff);\n",(unsigned char)begin); - } - fprintf(fp," else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer); - } - } - free(ccw); - if (state->bitState.bitContainer & 2) { - fprintf(fp," else stateMatch(buff);\n"); - } else { - fprintf(fp," else stateSkip(buff);\n"); - } - } - fputs("}\n\n",fp); + generateState1(state,state->bitState.bitContainer,true,fp,tg); } fclose(fp); }