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