# HG changeset patch # User Masataka Kohagura # Date 1450414961 -32400 # Node ID e2e717fbeb2f4824d0ac0959396a08bba3cef2d6 # Parent 1c9e8ba64f6a007ae0f1f28e33f978066d6ee523 fix diff -r 1c9e8ba64f6a -r e2e717fbeb2f c/regexParser/Makefile --- a/c/regexParser/Makefile Wed Dec 16 17:28:53 2015 +0900 +++ b/c/regexParser/Makefile Fri Dec 18 14:02:41 2015 +0900 @@ -3,7 +3,7 @@ CC= clang++ SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = determinize.cc subsetConstraction.cc +SRCS_EXCLUDE = determinize.cc SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o) diff -r 1c9e8ba64f6a -r e2e717fbeb2f c/regexParser/main.cc --- a/c/regexParser/main.cc Wed Dec 16 17:28:53 2015 +0900 +++ b/c/regexParser/main.cc Fri Dec 18 14:02:41 2015 +0900 @@ -20,5 +20,6 @@ printf("regex : %s\n",ri->ptr); NodePtr n = regex(ri); printTree(n); + TransitionGenerator tg = generateTransitionList(n); return 0; } diff -r 1c9e8ba64f6a -r e2e717fbeb2f c/regexParser/subsetConstraction.cc --- a/c/regexParser/subsetConstraction.cc Wed Dec 16 17:28:53 2015 +0900 +++ b/c/regexParser/subsetConstraction.cc Fri Dec 18 14:02:41 2015 +0900 @@ -14,12 +14,12 @@ // 必要ならばnextStateを重ねあわせる // 変更があった場合は新しくリストを作って返す if (end < cc->cond.range.begin ) { // 1 - CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); + CharClassPtr cc1 = charClassMerge(cc,cc->cond.range.begin,cc->cond.range.end,nextState); if (cc->left) { cc1->left = charClassMerge(cc->left,begin,end,nextState); return cc1; } else { - CharClassPtr cc2 = createCharClassRange(begin,end,0,0); + CharClassPtr cc2 = charClassMerge(begin,end,0,0); cc2->nextState = nextState; cc1->left = cc2; return cc1; @@ -36,7 +36,7 @@ if (cc->right) { cc->right = charClassMerge(cc->right,begin,end); } else { - cc->right = createCharClassRange(begin,end,0,0); + cc->right = charClassMerge(begin,end,0,0); } return cc; } @@ -48,7 +48,7 @@ } if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11,8 - } else if (begin < cc->cond.range.begin) { // 6 + } else if (begin < cc->cond.range.begin) { // 5 cc->cond.range.begin = begin; cc->cond.range.end = end; } else { @@ -57,35 +57,51 @@ return cc; } -void printTransition(TransitionPtr ts) { - -} - TGValue generateTransition(NodePtr n,TransitionGenerator tg) { if (n->tokenType == '+') { TGValue tgv = generateTransition(n->left,tg); if (tgv.asterisk) { TGValue tgv1 = generateTransition(n->right,tg); - tgv.ts->state->bitContainer |= tgv1.ts->state->bitContainer; + tgv.ts->nextState->bitContainer |= tgv1.ts->nextState->bitContainer; return tgv; } - bitSet(tgv.ts->state,n->right->nodeNumber); + 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'){ } 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 } } +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; } diff -r 1c9e8ba64f6a -r e2e717fbeb2f c/regexParser/transition.h --- a/c/regexParser/transition.h Wed Dec 16 17:28:53 2015 +0900 +++ b/c/regexParser/transition.h Fri Dec 18 14:02:41 2015 +0900 @@ -1,7 +1,6 @@ #include "bitVector.h" typedef struct transition { - BitVectorPtr state; CharClassPtr condition; BitVectorPtr nextState; struct transition *next;