# HG changeset patch # User Masataka Kohagura # Date 1454154277 -32400 # Node ID 7b4bcc7b5ae6ff20f9d329a675ce2e0af7ea4cf5 # Parent 0faa561ac9ff9e1bf64b5b605f4cdfeb74c59055 nextTState implemented diff -r 0faa561ac9ff -r 7b4bcc7b5ae6 regexParser/cerium/CeriumMain.cc --- a/regexParser/cerium/CeriumMain.cc Sat Jan 30 19:08:01 2016 +0900 +++ b/regexParser/cerium/CeriumMain.cc Sat Jan 30 20:44:37 2016 +0900 @@ -27,8 +27,11 @@ char *filename = 0; st_time = getTime(); Search s = grep(argc,argv,true); + createAnyState(s.tg); generateTState(s.tg->anyState,s.tg); + // generateTState for startState. It is used in stateMatch. + generateTState(s.tg->stateList,s.tg); FileMapReduce *fmp = new FileMapReduce(manager,TASK_EXEC,TASK_EXEC_DATA_PARALLEL,TASK_PRINT); filename = fmp->init(argc, argv); diff -r 0faa561ac9ff -r 7b4bcc7b5ae6 regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Sat Jan 30 19:08:01 2016 +0900 +++ b/regexParser/subsetConstruction.cc Sat Jan 30 20:44:37 2016 +0900 @@ -235,6 +235,7 @@ s->bitState = bi; s->cc = NULL; s->node = NULL; + s->tState = NULL; return s; } @@ -364,8 +365,10 @@ void createAnyState(TransitionGeneratorPtr tg) { BitVector anyBi = createBitVector(tg->totalBasicState); - anyBi.bitContainer = anyBi.bitContainer * 2 - 1; // all bit 1 state + anyBi.bitContainer = anyBi.bitContainer - 1; // all bit 1 state + anyBi.bitContainer ^= 2; // exclude Accept State tg->anyState = createState(tg,anyBi); + determinize(tg->anyState,tg); tg->stateArray[tg->anyState->bitState.bitContainer] = tg->anyState; } @@ -412,6 +415,7 @@ } StatePtr base = tg->stateArray[baseNum]; if (base == NULL) { + fprintf(stderr,"baseNum=%lx ",baseNum); errorMassege("No base state",__LINE__,__FILE__); break; } CharClassPtr merge = mergeTransition(s,base->cc); diff -r 0faa561ac9ff -r 7b4bcc7b5ae6 regexParser/threadedSearch.cc --- a/regexParser/threadedSearch.cc Sat Jan 30 19:08:01 2016 +0900 +++ b/regexParser/threadedSearch.cc Sat Jan 30 20:44:37 2016 +0900 @@ -46,8 +46,10 @@ tState->stateSkip = tg->stateSkip; tState->stateContinue = tg->stateNothing; } - if (ccvSize == 0) return tState; - else tState->ccv = (ccv*)malloc(sizeof(ccv)*ccvSize); + if (ccvSize == 0) { + tState->ccv = NULL; + return tState; + } else tState->ccv = (ccv*)malloc(sizeof(ccv)*ccvSize); ccw = createCharClassWalker(state->cc); int i = 0; while (hasNext(ccw)) { @@ -65,6 +67,21 @@ return tState; } +TStatePtr nextTState(BitVector bi,TransitionGeneratorPtr tg) { + // create tSearch in next state. + StatePtr state = tg->stateArray[bi.bitContainer]; + if (state == NULL) { + // on the fly subset construction. + state = createState(tg,bi); + determinize(state,tg); + tg->stateArray[bi.bitContainer] = state; + } + if (state->tState == NULL) { + generateTState(state,tg); + } + return state->tState; +} + void tSearch(TSValue tsv) { next: while (tsv.buff.buffptr < tsv.buff.buffend) { unsigned char c = *tsv.buff.buffptr++; @@ -79,24 +96,12 @@ // match the word. // if (not match) continue; } - TStatePtr current = ccv->tState; - if (current == NULL) { - // create tSearch in next state. - StatePtr state = tsv.tg->stateArray[ccv->state.bitContainer]; - if (state == NULL) { - // on the fly subset construction. - state = createState(tsv.tg,state->bitState); - determinize(state,tsv.tg); - tsv.tg->stateArray[state->bitState.bitContainer] = state; - } - if (state->tState == NULL) { - current = generateTState(state,tsv.tg); - ccv->tState = current; - } else { - ccv->tState = state->tState; - } + if (ccv->tState) { + tsv.current = ccv->tState; + } else { + tsv.current = nextTState(ccv->state,tsv.tg); + ccv->tState = tsv.current; } - tsv.current = ccv->tState; // tsv = tsv.current->stateContinue(tsv); goto next; }