Mercurial > hg > Papers > 2016 > masa-master
comparison c4.tex @ 34:660c8f2365db
fix
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Feb 2016 22:26:29 +0900 |
parents | 67b1a7f36b6c |
children | 466a8ed9c372 |
comparison
equal
deleted
inserted
replaced
33:67b1a7f36b6c | 34:660c8f2365db |
---|---|
150 実装した正規表現マッチャのアルゴリズムは、 | 150 実装した正規表現マッチャのアルゴリズムは、 |
151 | 151 |
152 \begin{enumerate} | 152 \begin{enumerate} |
153 \item 与えられた正規表現を構文解析し、正規表現木に変換する。 | 153 \item 与えられた正規表現を構文解析し、正規表現木に変換する。 |
154 \item 正規表現木から非決定性オートマトン(以下、NFA)か決定性オートマトン(以下、DFA)に変換する。 | 154 \item 正規表現木から非決定性オートマトン(以下、NFA)か決定性オートマトン(以下、DFA)に変換する。 |
155 \item NFA に変換された場合、Subset Construction による NFA から DFA への変換をおこない、状態遷移リストを生成する。 | 155 \item NFA に変換された場合、Subset Construction による NFA から DFA への変換をおこない、状態遷移テーブルを生成する。 |
156 \item 状態遷移のリストを元に文字列検索を行ない結果を返す。 | 156 \item 状態遷移のテーブルを元に文字列検索を行ない結果を返す。 |
157 \end{enumerate} | 157 \end{enumerate} |
158 | 158 |
159 となる。本項はそれぞれのアルゴリズムについて述べていく。 | 159 となる。本項はそれぞれのアルゴリズムについて述べていく。 |
160 | 160 |
161 \newpage | 161 \newpage |
301 \newpage | 301 \newpage |
302 \subsection{正規表現木から DFA・NFA の生成} | 302 \subsection{正規表現木から DFA・NFA の生成} |
303 | 303 |
304 次に正規表現木から非決定性有限オートマトン(NFA)、決定性有限オートマトン(DFA)を生成する。 | 304 次に正規表現木から非決定性有限オートマトン(NFA)、決定性有限オートマトン(DFA)を生成する。 |
305 | 305 |
306 オートマトンは、入力に対して状態に対応した処理を行ない結果を出力する(オートマトンの簡単な説明) | 306 オートマトンは、入力に対して状態に対応した処理を行ない結果を出力する仮想的な自動機械である。 |
307 正規表現はオートマトンで表現することができるので、状態と入力(ここでは正規表現)が判れば次はどのような状態になるのか示すことができる。 | |
307 | 308 |
308 \begin{figure}[htpb] | 309 \begin{figure}[htpb] |
309 \begin{center} | 310 \begin{center} |
310 \includegraphics[scale=0.2]{images/regex/setstate.pdf} | 311 \includegraphics[scale=0.2]{images/regex/setstate.pdf} |
311 \end{center} | 312 \end{center} |
312 \caption{set state} | 313 \caption{与えられた正規表現のオートマトンと正規表現木の例} |
313 \label{fig:set state} | 314 \label{fig:set state} |
314 \end{figure} | 315 \end{figure} |
315 | 316 |
316 正規表現木を深さ優先探索にて左から辿っていき、文字のノードにそれぞれ状態を番号で割り振りを行う。 | 317 正規表現木を深さ優先探索にて左から辿っていき、文字のノードにそれぞれ状態を番号で割り振りを行う。 |
317 また、状態の振り方は探索した際のメタ文字のノードに沿って割り振りを行う。 | 318 また、状態の振り方は探索した際のメタ文字のノードに沿って割り振りを行う。 |
376 \label{fig:stateasta} | 377 \label{fig:stateasta} |
377 \end{figure} | 378 \end{figure} |
378 | 379 |
379 \newpage | 380 \newpage |
380 | 381 |
382 図\ref{fig:stateafasta}は連接 `+' の後の文字に繰返し `*' が接続されている場合の正規表現である。 | |
383 受理される文字列の集合は \{a,ab,abb,abb,abb...bb\} である。 | |
384 この場合、初期状態に a が入力されると受理状態に遷移する。しかし、受理状態でも b がそれ以降に入力されれば、自分自身に状態遷移する。 | |
385 これより、`+' の右ノードに `*' が接続されていたら、`+' の左ノードに接続されている木の最後の状態に受理状態を付け加える。また、`*' に接続されている木の最後の状態にも受理状態を付け加える。 | |
386 | |
381 \begin{figure}[htpb] | 387 \begin{figure}[htpb] |
382 \begin{center} | 388 \begin{center} |
383 \includegraphics[scale=0.2]{images/regex/stateafasta.pdf} | 389 \includegraphics[scale=0.2]{images/regex/stateafasta.pdf} |
384 \end{center} | 390 \end{center} |
385 \caption{連接の後ろの文字に `*' が接続されているときの状態割当} | 391 \caption{連接の後ろの文字に `*' が接続されているときの状態割当} |
386 \label{fig:stateafasta} | 392 \label{fig:stateafasta} |
387 \end{figure} | 393 \end{figure} |
388 | 394 |
395 図\ref{fig:stateasta3}は連接 `+' が連続しており、連接の途中で繰返し `*' が接続されている場合の正規表現である。 | |
396 受理される文字列の集合は \{ac,abc,abbc,abbbc,abb...bbc\} である。 | |
397 この場合、初期状態に a が入力されると次の状態に遷移する。その状態で b が入力されると自分自身に遷移し、c が入力されると受理状態に遷移する。 | |
398 | |
399 これより、連接中に `*' があれば新しい状態を生成し、その状態を `*' の親ノードのさらに親ノードの右ノードに同じ状態にする。 | |
389 | 400 |
390 \begin{figure}[htpb] | 401 \begin{figure}[htpb] |
391 \begin{center} | 402 \begin{center} |
392 \includegraphics[scale=0.2]{images/regex/stateasta3.pdf} | 403 \includegraphics[scale=0.2]{images/regex/stateasta3.pdf} |
393 \end{center} | 404 \end{center} |
395 \label{fig:stateasta3} | 406 \label{fig:stateasta3} |
396 \end{figure} | 407 \end{figure} |
397 | 408 |
398 \newpage | 409 \newpage |
399 | 410 |
411 図\ref{fig:stateselectasta}は選択 `\textbar' がグループ化によって一つの正規表現となり、それ自身が繰り返されている場合の正規表現である。 | |
412 受理される文字列の集合は \{c,ac,bc,aabc,abbc,a..ab..bc\} である。 | |
413 この場合、初期状態に a か b が入力されると自分自身の状態に遷移する。その状態で c が入力されると受理状態に遷移する。 | |
414 これは、選択 `\textbar' と繰返し `*' の状態割当方法の組み合わせにて状態を決定することができる。 | |
415 まず `a \textbar b' は同じ状態を割り当て、その親ノードが `*' なので `*' の親の右ノードに同じ状態を割り当てる。 | |
416 | |
400 \begin{figure}[htpb] | 417 \begin{figure}[htpb] |
401 \begin{center} | 418 \begin{center} |
402 \includegraphics[scale=0.2]{images/regex/stateselectasta.pdf} | 419 \includegraphics[scale=0.2]{images/regex/stateselectasta.pdf} |
403 \end{center} | 420 \end{center} |
404 \caption{選択 `\textbar' と繰返し `*' の組み合わせの状態割当} | 421 \caption{選択 `\textbar' と繰返し `*' の組み合わせの状態割当} |
405 \label{fig:stateselectasta} | 422 \label{fig:stateselectasta} |
406 \end{figure} | 423 \end{figure} |
407 | 424 |
408 | 425 \newpage |
409 | 426 |
410 たどっていきながら、次の状態の遷移先と遷移条件をそれぞれの状態に設定していく。 | 427 以上の規則で正規表現木を辿った時にノードに対して状態を割り振る。 |
411 | 428 まとめると、 |
412 | 429 |
413 | 430 \begin{itemize} |
414 前が `*' でない `+' は新しい状態を作る。 | 431 \item 左子ノードが `*' でない `+' は新しい状態を作る |
415 | 432 \item `\textbar'が親ノードの場合、子ノードの最初の状態は同じ状態。 |
416 `*' があれば、次の状態はその時の先頭の状態か次の状態が終了状態ならば終了状態との組み合わせになる。 | 433 \item `*' があれば、次の状態は `*' に接続されている木の先頭の状態と同じ。次の状態が受理状態なら先頭の状態と受理状態の組み合わせになる。 |
417 | 434 \end{itemize} |
418 割り当てられた状態に沿って charclass の行き先を書き換える | 435 |
419 | 436 これにより、正規表現木に状態の割り振りを行ない、入力を行なったら状態が遷移するようにできた。 |
420 書き換えた charclass を merge する | 437 現在の状態(current state)と入力(input)によって次の状態(next state)が一意に決まっており、それをテーブル化して正規表現をファイルにかける。(図\ref{fig:dfaregex}) |
421 | 438 |
422 前の部分に * がない + は新しい状態をつくるので、state を切り替えて生成する | 439 \begin{figure}[htpb] |
423 | 440 \begin{center} |
424 \subsection{Subset Construction による NFA から DFA の変換と状態遷移リストの生成} | 441 \includegraphics[scale=0.2]{images/regex/dfaregex.pdf} |
442 \end{center} | |
443 \caption{dfa} | |
444 \label{fig:dfaregex} | |
445 \end{figure} | |
446 | |
447 しかし、生成された正規表現木によっては、現在の状態と入力による次の状態が一意に決まらない場合もある。 | |
448 図\ref{fig:nfaregex} | |
449 | |
450 | |
451 \subsection{Subset Construction による NFA から DFA の変換と状態遷移テーブルの生成} | |
452 | |
453 \begin{figure}[htpb] | |
454 \begin{center} | |
455 \includegraphics[scale=0.2]{images/regex/dfa.pdf} | |
456 \end{center} | |
457 \caption{dfa} | |
458 \label{fig:dfa} | |
459 \end{figure} | |
460 | |
461 \begin{figure}[htpb] | |
462 \begin{center} | |
463 \includegraphics[scale=0.2]{images/regex/nfa.pdf} | |
464 \end{center} | |
465 \caption{nfa} | |
466 \label{fig:nfa} | |
467 \end{figure} | |
425 | 468 |
426 \begin{figure}[htpb] | 469 \begin{figure}[htpb] |
427 \begin{center} | 470 \begin{center} |
428 \includegraphics[scale=0.2]{images/regex/transitiontable.pdf} | 471 \includegraphics[scale=0.2]{images/regex/transitiontable.pdf} |
429 \end{center} | 472 \end{center} |
430 \caption{Transition Table} | 473 \caption{Transition Table} |
431 \label{fig:transitiontable} | 474 \label{fig:transitiontable} |
432 \end{figure} | 475 \end{figure} |
433 | 476 |
434 現在のステートに含まれる組み合わせ状態をとってくる | |
435 | |
436 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する | |
437 | |
438 生成した状態は stateArray に格納する | |
439 | |
440 新しい状態ができなくなったら終了 | |
441 | |
442 \begin{figure}[htpb] | 477 \begin{figure}[htpb] |
443 \begin{center} | 478 \begin{center} |
444 \includegraphics[scale=0.2]{images/regex/CharClassMergePattern.pdf} | 479 \includegraphics[scale=0.2]{images/regex/CharClassMergePattern.pdf} |
445 \end{center} | 480 \end{center} |
446 \caption{2つの Character Class を merge するときの全パターン} | 481 \caption{2つの Character Class を merge するときの全パターン} |
453 \end{center} | 488 \end{center} |
454 \caption{Character Class を二分木で表示} | 489 \caption{Character Class を二分木で表示} |
455 \label{fig:ccinsert1} | 490 \label{fig:ccinsert1} |
456 \end{figure} | 491 \end{figure} |
457 | 492 |
493 | |
458 \begin{figure}[htpb] | 494 \begin{figure}[htpb] |
459 \begin{center} | 495 \begin{center} |
460 \includegraphics[scale=0.2]{images/regex/ccinsert2.pdf} | 496 \includegraphics[scale=0.2]{images/regex/ccinsert2.pdf} |
461 \end{center} | 497 \end{center} |
462 \caption{ある Character Class の二分木に対して、新しい Character Class を insert} | 498 \caption{ある Character Class の二分木に対して、新しい Character Class を insert} |
469 \end{center} | 505 \end{center} |
470 \caption{insert 後の Character Class の二分木} | 506 \caption{insert 後の Character Class の二分木} |
471 \label{fig:ccinsertresult} | 507 \label{fig:ccinsertresult} |
472 \end{figure} | 508 \end{figure} |
473 | 509 |
474 \begin{figure}[htpb] | 510 |
475 \begin{center} | 511 現在のステートに含まれる組み合わせ状態をとってくる |
476 \includegraphics[scale=0.2]{images/regex/dfa.pdf} | 512 |
477 \end{center} | 513 組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する |
478 \caption{dfa} | 514 |
479 \label{fig:dfa} | 515 生成した状態は stateArray に格納する |
480 \end{figure} | 516 |
481 | 517 新しい状態ができなくなったら終了 |
482 \begin{figure}[htpb] | 518 |
483 \begin{center} | 519 |
484 \includegraphics[scale=0.2]{images/regex/nfa.pdf} | |
485 \end{center} | |
486 \caption{nfa} | |
487 \label{fig:nfa} | |
488 \end{figure} | |
489 |