Mercurial > hg > Members > masakoha > testcode
view c/regexParser/subsetConstraction.cc @ 163:f0a347cd9c6a pairPro
fix subsetconstraction.cc
author | masa |
---|---|
date | Fri, 18 Dec 2015 19:44:07 +0900 |
parents | dcd751ba7103 |
children | 96854eba17e5 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include "subsetConstraction.h" CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { CharClassPtr cc = NEW(CharClass); return cc; } CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState) { // 重なっているccの領域を分割する // 必要ならばnextStateを重ねあわせる // 変更があった場合は新しくリストを作って返す if (end < cc->cond.range.begin ) { // 1 if (cc->left) { return createCharClassRange(cc->cond.range.begin,cc->cond.range.end,charClassMerge(cc->left,begin,end,nextState),cc->right); } else { CharClassPtr cc1 = createCharClassRange(begin,end,NULL,cc); cc1->nextState = nextState; return cc1; } } else if (end == cc->cond.range.begin && begin != end ) { // 2 CharClassPtr cc1; if (cc->left) { cc1 = charClassMerge(cc->left,begin,end-1,nextState); } else { cc1 = createCharClassRange(begin,end-1,NULL,NULL); cc1->nextState = nextState; } if (cc->cond.range.begin == cc->cond.range.end) { CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc->right); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; } CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin+1,cc->cond.range.end,cc->left,cc->right); cc3->nextState = cc->nextState; 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) { // range.begin < end if (begin < cc->cond.range.begin) { // 3 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 = createCharClassRange(end+1,cc->cond.range.end,cc->left,cc->right); cc3->nextState = cc->nextState; CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,end,cc1,cc3); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; } if (begin == cc->cond.range.begin) { // 6 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; return cc1; } // 9 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); 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); cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc1; } else if (end == cc->cond.range.end) { if (begin == cc->cond.range.begin) { // 7 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc->right); cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc1; } else if (begin < cc->cond.range.begin) { // 4 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 = createCharClassRange(cc->cond.range.begin,end,cc1,cc->right); cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc3; } // 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,cc->left,cc2); cc1->nextState = cc->nextState; return cc1; } if (begin > cc->cond.range.end ) { // 13 if (cc->right) { return createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,charClassMerge(cc->right,begin,end,nextState)); } else { CharClassPtr cc1 = createCharClassRange(begin,end,cc,NULL); cc1->nextState = nextState; return cc1; } } if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { if (end > cc->cond.range.end) { // cond.range.end < end if (begin == cc->cond.range.begin) { // 8 CharClassPtr cc1; if (cc->right) { cc1 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState); } else { cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL); cc1->nextState = nextState; } 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) { cc1 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState); } else { cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL); cc1->nextState = nextState; } 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; } } // 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); } else { cc1 = createCharClassRange(begin+1,end,NULL,NULL); cc1->nextState = nextState; } if (cc->cond.range.begin == cc->cond.range.end) { CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc->right); cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; return cc2; } 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 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); } return cc; } TGValue generateTransition(NodePtr n,TransitionGenerator tg) { TGValue tgv2; if (n->tokenType == '+') { TGValue tgv = generateTransition(n->left,tg); if (tgv.asterisk) { TGValue tgv1 = generateTransition(n->right,tg); tgv.ts->nextState->bitContainer |= tgv1.ts->nextState->bitContainer; return tgv; } TGValue tgv1 = generateTransition(n->right,tg); tgv.ts->nextState = tgv1.ts->nextState; return tgv; } else if (n->tokenType == '|') { TGValue tgv = generateTransition(n->left,tg); TGValue tgv1 = generateTransition(n->right,tg); tgv.ts = appendTransition(tgv.ts,tgv1.ts); return tgv; } else if (n->tokenType == '*') { TGValue tgv = generateTransition(n->left,tg); tgv.asterisk = true; return tgv; } else if (n->tokenType == 'c'){ return tgv2; } else if (n->tokenType == 'a'){ TGValue tgv; tgv.ts = (TransitionPtr)malloc(sizeof(Transition)); tgv.ts->condition = n->cc; tgv.ts->nextState = (BitVectorPtr)malloc(sizeof(BitVector)); bitSet(tgv.ts->nextState,n->nodeNumber); tg.ts = appendTransition(tg.ts,tgv.ts); return tgv; } else { // error } return tgv2; } void printTransitionList(TransitionPtr ts) { for (;ts;ts = ts->next) { printf("\n"); } } TransitionGenerator generateTransitionList(NodePtr n) { TransitionGenerator tg; tg.ts = (TransitionPtr)malloc(sizeof(Transition)); generateTransition(n,tg); printTransitionList(tg.ts); return tg; }