Mercurial > hg > Applications > Grep
diff regexParser/subsetConstraction.cc @ 178:5e8c6857934c pairPro
implement charClassMerge
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 23 Dec 2015 19:17:36 +0900 |
parents | 8de9a33f6ae5 |
children | d97bcab546e8 |
line wrap: on
line diff
--- a/regexParser/subsetConstraction.cc Wed Dec 23 17:28:59 2015 +0900 +++ b/regexParser/subsetConstraction.cc Wed Dec 23 19:17:36 2015 +0900 @@ -159,9 +159,12 @@ return current; } -TransitionPtr mergeTransition(TransitionPtr x,TransitionPtr y) { - CharClassWalkerPtr walk = createCharClassWalker(x->condition); - CharClassPtr ccy = y->condition; +CharClassPtr mergeTransition(StatePtr x,CharClassPtr y) { + if (x->cc == NULL) { + return y; + } + CharClassWalkerPtr walk = createCharClassWalker(x->cc); + CharClassPtr ccy = y; BitVector bi; for (CharClassPtr cc = getNext(walk); hasNext(walk); cc=getNext(walk)) { unsigned long begin = cc->cond.range.begin; @@ -169,41 +172,34 @@ bi = cc->nextState; ccy = charClassMerge(ccy,begin,end,bi); } - TransitionPtr z = createTransition(ccy,&bi); free(walk); - return z; + return ccy; } -TGValue generateTransition(NodePtr n,TransitionGenerator tg) { +TGValue generateTransition(NodePtr n,TGValue tg) { TGValue tgv2; if (n->tokenType == '+') { TGValue tgv = generateTransition(n->right,tg); - TGValue tgv1 = generateTransition(n->left,tg); if (tgv.asterisk) { - tgv1.ts = mergeTransition(tgv.ts,tgv1.ts); + TGValue tgv1 = generateTransition(n->left,tgv); return tgv1; } + TGValue tgLeft = createTransitionGenerator(tgv); + TGValue tgv1 = generateTransition(n->left,tgLeft); return tgv; } else if (n->tokenType == '|') { TGValue tgv = generateTransition(n->left,tg); - TGValue tgv1 = generateTransition(n->right,tg); + TGValue tgv1 = generateTransition(n->right,tgv); tgv.tg = tgv1.tg; - tgv.ts = mergeTransition(tgv.ts,tgv1.ts); 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'){ - tgv2.ts = createTransition(n->cc,0); - return tgv2; - } else if (n->tokenType == 'a'){ - TGValue tgv; - tgv.ts = NEW(Transition); - tgv.ts->condition = n->cc; - bitSet(&tgv.ts->condition->nextState,n->nodeNumber); - tg.ts = appendTransition(tg.ts,tgv.ts); + } else if (n->tokenType == 'c' || n->tokenType == 'a'){ + TGValue tgv = tg; + tgv.ts = mergeTransition(tgv.ts,n->cc); return tgv; } else { // error