# HG changeset patch # User Masataka Kohagura # Date 1452854933 -32400 # Node ID 399380ad95b74c0c0bf9b7c6f5c26262d1d6d015 # Parent 8be58af605dad67e3ddc3527501507cfa08f9507 fix generateTransitionGenerator diff -r 8be58af605da -r 399380ad95b7 regexParser/bitVector.h --- a/regexParser/bitVector.h Fri Jan 15 19:11:35 2016 +0900 +++ b/regexParser/bitVector.h Fri Jan 15 19:48:53 2016 +0900 @@ -1,6 +1,6 @@ extern BitVector createBitVector(int state); extern const BitVectorPtr allocateBitVector(); -extern void bitSet(BitVectorPtr bi, int bitSetPosition); +extern BitVector bitSet(BitVector bi, int bitSetPosition); extern void bitPrint(BitVectorPtr bi); inline int searchBit(BitVector bi) { diff -r 8be58af605da -r 399380ad95b7 regexParser/main.cc --- a/regexParser/main.cc Fri Jan 15 19:11:35 2016 +0900 +++ b/regexParser/main.cc Fri Jan 15 19:48:53 2016 +0900 @@ -9,6 +9,7 @@ { bool generate = true; bool subset = false; + bool generateSequentialSearch = false; RegexInfo ri; ri.stateNumber = 1; @@ -19,6 +20,8 @@ generate = false; } else if (strcmp(argv[i],"-subset") == 0) { subset = true; + } else if (strcmp(argv[i],"-seq") == 0) { + generateSequentialSearch = true; } } if (!ri.ptr) return 0; @@ -31,13 +34,17 @@ TGValue tgv = generateTransitionList(n); printTree(n); printState(tgv.tg); - exportState(tgv.tg); + if (generateSequentialSearch) { + exportState(tgv.tg); + } } else if (subset) { TGValue tgv = generateTransitionList(n); SCValue scv = createSCValue(tgv); subsetConstruction(scv); // Determinization printState(tgv.tg); - exportState(tgv.tg); + if (generateSequentialSearch) { + exportState(tgv.tg); + } } return 0; } diff -r 8be58af605da -r 399380ad95b7 regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Fri Jan 15 19:11:35 2016 +0900 +++ b/regexParser/subsetConstruction.cc Fri Jan 15 19:48:53 2016 +0900 @@ -212,7 +212,7 @@ /** pass 1 : 正規表現に必要な状態を探して、それぞれに番号を割り振る 前が * でない + は新しく状態を作る - * があったら、次の状態はその時の先頭の状態になる + * があったら、次の状態はその時の先頭の状態か次の状態が終了状態ならば終了状態との組み合わせになる 常に先頭の状態を返す 最後が*ならば、それを持ち歩く pass 2: @@ -250,9 +250,14 @@ return tgv2; } else if (n->tokenType == '*') { TGValue tgvAstah = tgv; - tgvAstah.endState = tgvAstah.startState; + if (tgvAstah.endState->bitState.bitContainer & 2) { + tgvAstah.endState = tgvAstah.startState; + tgvAstah.endState->bitState = bitSet(tgvAstah.endState->bitState,1); + } else { + tgvAstah.endState = tgvAstah.startState; + } tgvAstah = generateTransition(n->left,tgvAstah,pass); - tgvAstah.asterisk = tgvAstah.startState; + tgvAstah.asterisk = tgvAstah.endState; return tgvAstah; } else if (n->tokenType == 'c' || n->tokenType == 'a'){ TGValue tgv1 = tgv;