# HG changeset patch # User Masataka Kohagura # Date 1450852887 -32400 # Node ID c092dd0e1ae060cf7d376654a69d8783dab614b2 # Parent 3be0fbcd4b523dd624b9b700f3f583a508348ba6 implement appendState() and serchState() diff -r 3be0fbcd4b52 -r c092dd0e1ae0 regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Tue Dec 22 20:27:26 2015 +0900 +++ b/regexParser/subsetConstraction.cc Wed Dec 23 15:41:27 2015 +0900 @@ -148,6 +148,7 @@ CharClassPtr next = findLeftMost(current->right,walk)->next; walk->next = next; } else { + /* TransitionPtr tsOld = ts; ts = ts->next; free(tsOld); @@ -155,6 +156,7 @@ if (ts) ret = ts->cc; else ret = NULL; walk->next = ret; + */ } return current; } @@ -222,13 +224,16 @@ tg.ts = NEW(Transition); tg.state = NEW(State); tg.transitionList = NEW(Transition); + // Init State : 00...00(64bit) BitVectorPtr initStateBi = NEW(BitVector); bitSet(initStateBi,INIT_STATE_BIT); - tg.stateArray = createState(tg.stateArray,*initStateBi); + StatePtr initState = createState(tg.stateArray,*initStateBi); + // Last State : 10...00(64bit) BitVectorPtr lastStateBi = NEW(BitVector); bitSet(lastStateBi,END_STATE_BIT); - tg.stateArray = createState(tg.stateArray,*lastStateBi); - tg.stateArrayLast = NEW(State); + StatePtr lastState = createState(tg.stateArray,*lastStateBi); + tg.stateArray = appendState(initState,lastState); + tg.stateArrayLast = lastState; tg.currentState = NEW(State); tg.nextState = NEW(State); return tg; diff -r 3be0fbcd4b52 -r c092dd0e1ae0 regexParser/transition.cc --- a/regexParser/transition.cc Tue Dec 22 20:27:26 2015 +0900 +++ b/regexParser/transition.cc Wed Dec 23 15:41:27 2015 +0900 @@ -1,13 +1,23 @@ #include #include "transition.h" +StatePtr searchState(StatePtr stateArray, StatePtr state) { + while(stateArray) { + if (stateArray->bitState.bitContainer == state->bitState.bitContainer) { + return stateArray; + } + if (stateArray->next == NULL) { + StatePtr s = createState(state,state->bitState); + stateArray = appendState(stateArray,s); + return stateArray; + } + stateArray = stateArray->next; + } + return stateArray; +} + StatePtr createState(StatePtr state,BitVector bi) { StatePtr s = state; - if (state != NULL) { - while (state->next) { - state = state->next; - } - } state = NEW(State); state->bitState = bi; state->transition = NEW(Transition); @@ -15,6 +25,21 @@ return s; } +StatePtr appendState(StatePtr x,StatePtr y) { + StatePtr x0 = createState(x,x->bitState); + StatePtr x1 = x0; + for(;;) { + if (x->next == NULL) { + x1->next = y; + return x0; + } + x = x->next; + x1->next = createState(x,x->bitState); + x1 = x1->next; + } + return x0; +} + TransitionPtr createTransition(CharClassPtr cc, BitVectorPtr state) { TransitionPtr transition = NEW(Transition); transition->condition = cc; diff -r 3be0fbcd4b52 -r c092dd0e1ae0 regexParser/transition.h --- a/regexParser/transition.h Tue Dec 22 20:27:26 2015 +0900 +++ b/regexParser/transition.h Wed Dec 23 15:41:27 2015 +0900 @@ -13,6 +13,7 @@ } State, *StatePtr; StatePtr createState(StatePtr state,BitVector bi); +StatePtr appendState(StatePtr x,StatePtr y); TransitionPtr createTransition(CharClassPtr cc, BitVectorPtr state); TransitionPtr appendTransition0(TransitionPtr curr,TransitionPtr next); TransitionPtr appendTransition(TransitionPtr curr,TransitionPtr next);