# HG changeset patch # User Masataka Kohagura # Date 1450954929 -32400 # Node ID 7ae0a3070647a380ce2a20658e3a448d58b96127 # Parent dbe004d03ef0a5da21e6a9888e603fb654c0e3a0 implement generateTransitionList diff -r dbe004d03ef0 -r 7ae0a3070647 regexParser/regexParser.cc --- a/regexParser/regexParser.cc Thu Dec 24 19:14:49 2015 +0900 +++ b/regexParser/regexParser.cc Thu Dec 24 20:02:09 2015 +0900 @@ -28,14 +28,11 @@ static NodePtr createNode(RegexInfoPtr ri,unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) { NodePtr n = allocateNode(); - n->tokenType = type; n->cc = cc; + n->state = NULL; n->left = left; n->right = right; - n->nodeNumber = ri->stateNumber; - ri->stateNumber++; - return n; } diff -r dbe004d03ef0 -r 7ae0a3070647 regexParser/regexParser.h --- a/regexParser/regexParser.h Thu Dec 24 19:14:49 2015 +0900 +++ b/regexParser/regexParser.h Thu Dec 24 20:02:09 2015 +0900 @@ -35,6 +35,9 @@ unsigned char tokenType; unsigned long nodeNumber; CharClassPtr cc; + int stateNum; + int nextStateNum; + StatePtr state; struct node *left; struct node *right; } Node, *NodePtr; diff -r dbe004d03ef0 -r 7ae0a3070647 regexParser/subsetConstraction.cc --- a/regexParser/subsetConstraction.cc Thu Dec 24 19:14:49 2015 +0900 +++ b/regexParser/subsetConstraction.cc Thu Dec 24 20:02:09 2015 +0900 @@ -203,8 +203,22 @@ return ccy; } +/** + 作成する state を linked list +bitvector を index とした配列に BitVectorPtr を格納 +state に対応する NodePtr を + */ +TGValue createState(TGValue tg,NodePtr n) { + StatePtr s = NEW(State); + s->next = tg.tg->currentState; + tg.tg->currentState = s; + s->node = n; + BitVector bi = createBitVector(tg.stateBegin); + s->bitState = bi; + s->cc = NULL; +} + TGValue stateAllocate(NodePtr n,TGValue tg) { - TGValue tgv2 = tg; if (n->tokenType == '+') { TGValue tgLeft = stateAllocate(n->left,tg); if (tgLeft.asterisk) { @@ -216,7 +230,7 @@ } TGValue tgRight = tgLeft; tgRight.stateBegin = ++tgRight.stateNum; - tgRight.state = NEW(State); + n->right->state = createState(tgRight,n->right); TGValue tgv1 = stateAllocate(n->right,tgLeft); return tgLeft; } else if (n->tokenType == '|') { @@ -232,44 +246,39 @@ } else if (n->tokenType == 'c' || n->tokenType == 'a'){ TGValue tgv = tg; tgv.asterisk = false; - BitVector bi = createBitVector(tgv.stateEnd); + n->stateNum = tg.stateBegin; + n->nextStateNum = tg.stateEnd; + return tgv; + } else { + return tg; + } +} + +TGValue generateTransition(NodePtr n,TGValue tg) { + if (n->tokenType == '+') { + StatePtr left = tg.state; + tg.state = n->left->state; + tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state; + TGValue tgLeft = generateTransition(n->left,tg); + tg.state = left; + TGValue tgv1 = generateTransition(n->right,tgLeft); + return tgv1; + } else if (n->tokenType == '|') { + TGValue tgv = generateTransition(n->left,tg); + TGValue tgv1 = generateTransition(n->right,tgv); + return tgv1; + } else if (n->tokenType == '*') { + tgAstah = generateTransition(n->left,tgAstah); + return tgAstah; + } else if (n->tokenType == 'c' || n->tokenType == 'a'){ + TGValue tgv = tg; + BitVector bi = createBitVector(n->nextStateNum); setState(n->cc,bi); tgv.state->cc = mergeTransition(tgv.state,n->cc); return tgv; } else { - // error + return tg; } - return tgv2; -} - -TGValue generateTransition(NodePtr n,TGValue tg) { - TGValue tgv2 = tg; - if (n->tokenType == '+') { - tgv2.stateBegin = ++tgv.stateNum; - TGValue tgLeft = generateTransition(n->right,tgv2); - tgLeft.stateEnd = tgv2.stateBegin; - TGValue tgv1 = generateTransition(n->left,tgLeft); - if (tgv1.asterisk) { - } - return tgv1; - } else if (n->tokenType == '|') { - TGValue tgv = generateTransition(n->left,tg); - TGValue tgv1 = generateTransition(n->right,tgv); - tgv.tg = tgv1.tg; - tgv.asterisk |= tgv1.asterisk; - return tgv; - } else if (n->tokenType == '*') { - TGValue tgv = generateTransition(n->left,tg); - tgv.asterisk = true; - return tgv; - } else if (n->tokenType == 'c' || n->tokenType == 'a'){ - TGValue tgv = tg; - tgv.ts = mergeTransition(tgv.ts,n->cc); - return tgv; - } else { - // error - } - return tgv2; } void printTransitionList(TransitionPtr ts) { @@ -300,7 +309,17 @@ TransitionGenerator generateTransitionList(NodePtr n) { TransitionGenerator tg = createTransitionGenerator(); - generateTransition(n,tg); + TGValue tgv; + tgv.asterisk = false; + tgv.tg = tg; + StatePtr start = createState(tgv,n); + NodePtr eof = createNode(); + StatePtr end = createState(tgv,eof); + tgv.stateBegin = 0; + tgv.stateEnd = 1; + stateAllocate(n,tgv); + tgv.tg.stateArray = (StatePtr)calloc(tg.stateNum,sizeof(StatePtr)); + generateTransition(n,tgv); printTransitionList(tg.ts); return tg; } diff -r dbe004d03ef0 -r 7ae0a3070647 regexParser/subsetConstraction.h --- a/regexParser/subsetConstraction.h Thu Dec 24 19:14:49 2015 +0900 +++ b/regexParser/subsetConstraction.h Thu Dec 24 20:02:09 2015 +0900 @@ -20,6 +20,7 @@ bool asterisk; int stateBegin; int stateEnd; + StatePtr state; TransitionGeneratorPtr tg; } TGValue, *TGValuePtr;