comparison regexParser/subsetConstruction.cc @ 223:e430b7d0b33d

fix exportState (not correct working)
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Fri, 15 Jan 2016 15:57:22 +0900
parents c38a7b2dd996
children 474fc9f844db
comparison
equal deleted inserted replaced
222:c38a7b2dd996 223:e430b7d0b33d
316 316
317 void exportState(TransitionGeneratorPtr tg) { 317 void exportState(TransitionGeneratorPtr tg) {
318 StatePtr state = tg->stateList; 318 StatePtr state = tg->stateList;
319 FILE *fp = fopen("state.cc","w"); 319 FILE *fp = fopen("state.cc","w");
320 char s[SIZE]; 320 char s[SIZE];
321
322 fputs("unsigned char *buff, *buffptr, buffend;\n",fp); 321 fputs("unsigned char *buff, *buffptr, buffend;\n",fp);
323 for (;state;state = state->next) { 322 for (;state;state = state->next) {
324 sprintf(s,"void state%lx() {\n",state->bitState.bitContainer); 323 sprintf(s,"void state%lx() {\n",state->bitState.bitContainer);
325 fputs(s,fp); 324 fputs(s,fp);
326 if (state->cc->cond.range.begin == state->cc->cond.range.end) { 325 fputs(" unsigned char c = *buffptr++;\n",fp);
327 if (state->cc) { // not Accept 326 CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
328 fputs(" unsigned char c = *buffptr++;\n",fp); 327 while (hasNext(ccw)) {
329 sprintf(s," if (c='%c') state%lu();\n",(unsigned char)state->cc->cond.range.begin, state->cc->nextState.bitContainer); 328 CharClassPtr cc = getNext(ccw);
330 fputs(s,fp); 329 unsigned long begin = cc->cond.range.begin;
331 } else { // Accept 330 unsigned long end = cc->cond.range.end;
331 BitVector bi = cc->nextState;
332 if (bi.bitContainer == 2) {
332 fputs(" // Accept\n",fp); 333 fputs(" // Accept\n",fp);
334 } else {
335 if (begin == end) {
336 sprintf(s," if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer);
337 fputs(s,fp);
338 } else {
339 sprintf(s," if (c<'%c') state1();\n",(unsigned char)begin);
340 fputs(s,fp);
341 sprintf(s," else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer);
342 fputs(s,fp);
343 }
333 } 344 }
334 } else { 345 }
335 if (state->cc) { // not Accept 346 sprintf(s," state1();\n");
336 fputs(" unsigned char c = *buffptr++;\n",fp); 347 fputs(s,fp);
337 sprintf(s," if (c<'%c') state%lu();\n",(unsigned char)state->cc->cond.range.begin, state->cc->nextState.bitContainer); 348 fputs("}\n\n",fp);
338 fputs(s,fp);
339 sprintf(s," if (c<'%c') state%lu();\n",(unsigned char)state->cc->cond.range.end, state->cc->nextState.bitContainer);
340 fputs(s,fp);
341 } else { // Accept
342 fputs(" // Accept\n",fp);
343 }
344 }
345 fputs("}\n",fp);
346 } 349 }
347 fclose(fp); 350 fclose(fp);
348 } 351 }
349 352
350 void printState(StatePtr state) { 353 void printState(StatePtr state) {