Mercurial > hg > Papers > 2016 > masa-master
changeset 105:7e40d0e6fba0
add tSearch generateTState source
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 19 Feb 2016 12:20:54 +0900 |
parents | 8223a72a80e5 |
children | 5bf012313690 |
files | slide/s6/index.html |
diffstat | 1 files changed, 152 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/s6/index.html Fri Feb 19 11:49:29 2016 +0900 +++ b/slide/s6/index.html Fri Feb 19 12:20:54 2016 +0900 @@ -434,6 +434,43 @@ </div> <div class='slide'> + <h2>文字クラスの構造体</h2> +<pre> +typedef struct utf8Range { + unsigned long begin; + unsigned long end; +} RangeList , *RangeListPtr; + +typedef struct condition { + RangeList range; + Word w; +} Condition, *ConditionList; + +typedef struct charClass { + struct charClass *left; + struct charClass *right; + Condition cond; + int stateNum; + BitVector nextState; +} CharClass, *CharClassPtr; +</pre> + <ul> + <li> + 正規表現木の文字ノードもしくは文字クラスノードこの構造体を持っている。 + </li> + <li> + 文字クラスは二分木で構築されている。 + </li> + <li> + 文字クラスの範囲は Condition 内の RangeList の begin と end に設定される。 + </li> + <li> + その Condition の範囲内の文字の入力があれば、次の状態 nextState に遷移する。 + </li> + </ul> + </div> + + <div class='slide'> <h2>正規表現木をオートマトンの状態遷移に沿って状態割当</h2> <object data="images/regex/allostate.svg" width="50%" type="image/svg+xml"></object><br> @@ -498,13 +535,25 @@ <ul> <li> - tgv は + TGValue は asterisk、startState、endState それぞれの状態を持っている。 + </li> + <li> + 正規表現木を二度 generateTransition に通す。 + </li> + <li> + それらの状態を正規表現木に対して Tree walk しながら状態を割り振っていく。 </li> <li> + '+' のとき、 </li> <li> + '|' のとき、 </li> <li> + '*' のとき、 + </li> + <li> + 文字または文字クラスのとき、 </li> </ul> </div> @@ -555,43 +604,6 @@ </div> <div class='slide'> - <h2>文字クラスの構造体</h2> -<pre> -typedef struct utf8Range { - unsigned long begin; - unsigned long end; -} RangeList , *RangeListPtr; - -typedef struct condition { - RangeList range; - Word w; -} Condition, *ConditionList; - -typedef struct charClass { - struct charClass *left; - struct charClass *right; - Condition cond; - int stateNum; - BitVector nextState; -} CharClass, *CharClassPtr; -</pre> - <ul> - <li> - 正規表現木の文字ノードもしくは文字クラスノードこの構造体を持っている。 - </li> - <li> - 文字クラスは二分木で構築されている。 - </li> - <li> - 文字クラスの範囲は Condition 内の RangeList の begin と end に設定される。 - </li> - <li> - その Condition の範囲内の文字の入力があれば、次の状態 nextState に遷移する。 - </li> - </ul> - </div> - - <div class='slide'> <h2>Subset Construction</h2> <object data="images/regex/sc.svg" width="50%" type="image/svg+xml"></object><br> <ul> @@ -604,12 +616,110 @@ </ul> </div> -<!-- <div class='slide'> - <h2>cc tree merge pattern</h2> - <object data="images/regex/CharClassMergePattern.svg" width="50%" type="image/svg+xml"></object><br> + <h2>並列処理時の正規表現のマッチング</h2> +<pre> +typedef struct tState { + State *state; + tsValue (*stateSkip)(tsValue); + tsValue (*stateMatch)(tsValue); + int ccvSize; + CCVPtr ccv; +} TState, *TStatePtr; + +TStatePtr generateTState(StatePtr state, TransitionGeneratorPtr tg) { + TStatePtr tState = NEW(TState); + tState->state = state; + int ccvSize = 0; + CharClassWalkerPtr ccw = createCharClassWalker(state->cc); + while (hasNext(ccw)) { + getNext(ccw); + ccvSize++; + } + tState->ccvSize = ccvSize; + if (state->accept) { + tState->stateMatch = tg->stateMatch; + tState->stateSkip = tg->stateSkip; + } else { + tState->stateMatch = tg->stateNothing; + tState->stateSkip = tg->stateSkip; + } + if (ccvSize == 0) { + tState->ccv = NULL; + state->tState = tState; + return tState; + } else tState->ccv = (ccv*)malloc(sizeof(ccv)*ccvSize); + ccw = createCharClassWalker(state->cc); + int i = 0; + while (hasNext(ccw)) { + CharClassPtr cc = getNext(ccw); + unsigned long begin = cc->cond.range.begin; + unsigned long end = cc->cond.range.end; + struct ccv *ccv = &tState->ccv[i++]; + ccv->begin = begin; + ccv->end = end; + ccv->tState = NULL; + ccv->state = cc->nextState; + ccv->w = cc->cond.w; + } + free(ccw); + state->tState = tState; + return tState; +} +</pre> + +<ul> +<li> +tState +</li> +<li> +</li> +<li> +</li> +</ul> </div> ---> + + + <div class='slide'> + <h2>並列処理時の正規表現のマッチング</h2> +<pre> +TSValue tSearch(TSValue tsv) { + next: while (tsv.buff.buffptr < tsv.buff.buffend) { + tsv = tsv.current->stateMatch(tsv); + if (tsv.current->ccvSize==0) { + tsv.current = tsv.tg->stateStart->tState; + } + unsigned char c = *tsv.buff.buffptr++; + for (int i = 0; i < tsv.current->ccvSize; i++) { + CCVPtr ccv = &tsv.current->ccv[i]; + if (c<ccv->begin) { + tsv.current = tsv.tg->stateStart->tState; + tsv = tsv.current->stateSkip(tsv); + goto next; + } else if (c<=ccv->end) { + // range matched. + if (ccv->w.word) { + // match the word. + // if (not match) continue; + } + if (ccv->tState) { + tsv.current = ccv->tState; + } else { + tsv.current = nextTState(ccv->state,tsv.tg); + ccv->tState = tsv.current; + } + goto next; + } + } + tsv.current = tsv.tg->stateStart->tState; + tsv = tsv.current->stateSkip(tsv); + } + return tsv; +} +</pre> + </div> + + <div class='slide'> <h2>正規表現の整合性</h2> <object data="images/regex/regexdivide.svg" width="50%" type="image/svg+xml"></object><br>