Mercurial > hg > Applications > Grep
diff regexParser/subsetConstruction.cc @ 222:c38a7b2dd996
implement exportState function (not correct working)
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Jan 2016 21:46:35 +0900 |
parents | 4dc8d327cc7d |
children | e430b7d0b33d |
line wrap: on
line diff
--- a/regexParser/subsetConstruction.cc Sat Jan 02 15:34:37 2016 +0900 +++ b/regexParser/subsetConstruction.cc Thu Jan 14 21:46:35 2016 +0900 @@ -8,6 +8,8 @@ #include "BitVector.h" #include "error.h" +#define SIZE 256 + CharClassPtr createCharClassRange(unsigned long begin, unsigned long end,unsigned long state, CharClassPtr left, CharClassPtr right) { CharClassPtr cc = NEW(CharClass); cc->type = 'r'; @@ -312,6 +314,39 @@ return tgv; } +void exportState(TransitionGeneratorPtr tg) { + StatePtr state = tg->stateList; + FILE *fp = fopen("state.cc","w"); + char s[SIZE]; + + fputs("unsigned char *buff, *buffptr, buffend;\n",fp); + for (;state;state = state->next) { + sprintf(s,"void state%lx() {\n",state->bitState.bitContainer); + fputs(s,fp); + if (state->cc->cond.range.begin == state->cc->cond.range.end) { + if (state->cc) { // not Accept + fputs(" unsigned char c = *buffptr++;\n",fp); + sprintf(s," if (c='%c') state%lu();\n",(unsigned char)state->cc->cond.range.begin, state->cc->nextState.bitContainer); + fputs(s,fp); + } else { // Accept + fputs(" // Accept\n",fp); + } + } else { + if (state->cc) { // not Accept + fputs(" unsigned char c = *buffptr++;\n",fp); + sprintf(s," if (c<'%c') state%lu();\n",(unsigned char)state->cc->cond.range.begin, state->cc->nextState.bitContainer); + fputs(s,fp); + sprintf(s," if (c<'%c') state%lu();\n",(unsigned char)state->cc->cond.range.end, state->cc->nextState.bitContainer); + fputs(s,fp); + } else { // Accept + fputs(" // Accept\n",fp); + } + } + fputs("}\n",fp); + } + fclose(fp); +} + void printState(StatePtr state) { printf("state : %lx\n",state->bitState.bitContainer); long nodeNumber = 0;