# HG changeset patch # User masa # Date 1450435447 -32400 # Node ID f0a347cd9c6aaa29cb4fa926a76368572145eeee # Parent d7f762404113b05a0893bd1b2bbf0715fd3c25e2 fix subsetconstraction.cc diff -r d7f762404113 -r f0a347cd9c6a c/regexParser/subsetConstraction.cc --- a/c/regexParser/subsetConstraction.cc Fri Dec 18 19:31:13 2015 +0900 +++ b/c/regexParser/subsetConstraction.cc Fri Dec 18 19:44:07 2015 +0900 @@ -20,7 +20,7 @@ cc1->nextState = nextState; return cc1; } - } else if (end == cc->cond.range.begin ) { // 2 + } else if (end == cc->cond.range.begin && begin != end ) { // 2 CharClassPtr cc1; if (cc->left) { cc1 = charClassMerge(cc->left,begin,end-1,nextState); @@ -38,7 +38,7 @@ CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.begin,cc1,cc3); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; - } else if (end < cc->cond.range.end) { + } else if (end < cc->cond.range.end) { // range.begin < end if (begin < cc->cond.range.begin) { // 3 CharClassPtr cc1; if (cc->left) { @@ -54,7 +54,7 @@ return cc2; } if (begin == cc->cond.range.begin) { // 6 - CharClassPtr cc2 = createCharClassRange(end,cc->cond.range.end,NULL,cc->right); + CharClassPtr cc2 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); cc2->nextState = cc->nextState; CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc2); cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; @@ -62,7 +62,7 @@ } // 9 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); - cc2->nextState = cc2->nextState; + cc2->nextState = cc->nextState; CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); cc3->nextState = cc->nextState; CharClassPtr cc1 = createCharClassRange(begin,end,cc2,cc3); @@ -85,10 +85,10 @@ cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc3; } - // 10 + // 10 cond.range.begin < begin CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,NULL,cc->right); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; - CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,NULL,NULL); + CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,cc2); cc1->nextState = cc->nextState; return cc1; } @@ -102,25 +102,19 @@ } } if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { - if (end > cc->cond.range.end) { + if (end > cc->cond.range.end) { // cond.range.end < end if (begin == cc->cond.range.begin) { // 8 CharClassPtr cc1; -<<<<<<< local if (cc->right) { - cc1 = charClassMerge(cc->right,begin,end-1,nextState); -======= - if (cc->right) { - cc1 = charClassMerge(cc->right,begin,cc->cond.range.end,nextState); ->>>>>>> other + cc1 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState); } else { - cc1 = createCharClassRange(begin,cc->cond.range.end,NULL,NULL); + cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL); cc1->nextState = nextState; } - CharClassPtr cc3 = createCharClassRange(cc->cond.range.end+1,end,cc->left,cc1); + CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc1); cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc3; } - if (begin > cc->cond.range.begin) { // 11 CharClassPtr cc1; if (cc->right) { @@ -129,15 +123,15 @@ cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL); cc1->nextState = nextState; } - CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,cc->right); + CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); cc3->nextState = cc->nextState; CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,cc3,cc1); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; } } - // 12 - if (begin == cc->cond.range.end) { + // begin != end && end != cc->cond.range.end + if (begin == cc->cond.range.end) { // 12 CharClassPtr cc1; if (cc->right) { cc1 = charClassMerge(cc->right,begin+1,end,nextState); @@ -150,22 +144,30 @@ cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; } - CharClassPtr cc3; - createCharClassRange(cc->cond.range.begin,cc->cond.range.end-1,cc->left,cc->right); + CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end-1,cc->left,NULL); cc3->nextState = cc->nextState; CharClassPtr cc2 = createCharClassRange(cc->cond.range.end,cc->cond.range.end,cc1,cc3); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; } - } else if (begin < cc->cond.range.begin) { // 5 - CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); - cc2->nextState = cc1->nextState; - CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); - cc3->nextState = cc->nextState; - CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc2,cc3); - cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; - return cc1; + CharClassPtr cc1; + if (cc->left) { + cc1 = charClassMerge(cc->left,begin,cc->cond.range.begin-1,nextState); + } else { + cc1 = createCharClassRange(begin,cc->cond.range.begin-1,NULL,NULL); + cc1->nextState = nextState; + } + CharClassPtr cc3; + if (cc->right) { + cc3 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState); + } else { + cc3 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL); + cc3->nextState = nextState; + } + CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc3); + cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; + return cc2; } else { printf("charClassMerge Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); }