# HG changeset patch # User Masataka Kohagura # Date 1452841042 -32400 # Node ID e430b7d0b33db3b80f01668d18462b5aadc56892 # Parent c38a7b2dd996f5638fbef5d18e7a5706fe262fdd fix exportState (not correct working) diff -r c38a7b2dd996 -r e430b7d0b33d regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Thu Jan 14 21:46:35 2016 +0900 +++ b/regexParser/subsetConstruction.cc Fri Jan 15 15:57:22 2016 +0900 @@ -318,31 +318,34 @@ 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(" unsigned char c = *buffptr++;\n",fp); + CharClassWalkerPtr ccw = createCharClassWalker(state->cc); + 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 (bi.bitContainer == 2) { 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); + } else { + if (begin == end) { + sprintf(s," if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer); + fputs(s,fp); + } else { + sprintf(s," if (c<'%c') state1();\n",(unsigned char)begin); + fputs(s,fp); + sprintf(s," else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer); + fputs(s,fp); + } } } - fputs("}\n",fp); + sprintf(s," state1();\n"); + fputs(s,fp); + fputs("}\n\n",fp); } fclose(fp); }