Mercurial > hg > Papers > 2010 > jsst-shinya
changeset 4:22ad03d59b3f
ver:3
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 15 Aug 2010 09:51:05 +0900 |
parents | b00e4e5b5368 |
children | 4f3747c18585 336542485a9b |
files | fig5.eps paper.pdf paper.tex |
diffstat | 3 files changed, 464 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fig5.eps Sun Aug 15 09:51:05 2010 +0900 @@ -0,0 +1,329 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: graphviz version 2.26.3 (20100126.1600) +%%Title: G +%%Pages: 1 +%%BoundingBox: 36 36 294 187 +%%EndComments +save +%%BeginProlog +/DotDict 200 dict def +DotDict begin + +/setupLatin1 { +mark +/EncodingVector 256 array def + EncodingVector 0 + +ISOLatin1Encoding 0 255 getinterval putinterval +EncodingVector 45 /hyphen put + +% Set up ISO Latin 1 character encoding +/starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont +} def +/Times-Roman starnetISO def +/Times-Italic starnetISO def +/Times-Bold starnetISO def +/Times-BoldItalic starnetISO def +/Helvetica starnetISO def +/Helvetica-Oblique starnetISO def +/Helvetica-Bold starnetISO def +/Helvetica-BoldOblique starnetISO def +/Courier starnetISO def +/Courier-Oblique starnetISO def +/Courier-Bold starnetISO def +/Courier-BoldOblique starnetISO def +cleartomark +} bind def + +%%BeginResource: procset graphviz 0 0 +/coord-font-family /Times-Roman def +/default-font-family /Times-Roman def +/coordfont coord-font-family findfont 8 scalefont def + +/InvScaleFactor 1.0 def +/set_scale { + dup 1 exch div /InvScaleFactor exch def + scale +} bind def + +% styles +/solid { [] 0 setdash } bind def +/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def +/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def +/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def +/bold { 2 setlinewidth } bind def +/filled { } bind def +/unfilled { } bind def +/rounded { } bind def +/diagonals { } bind def + +% hooks for setting color +/nodecolor { sethsbcolor } bind def +/edgecolor { sethsbcolor } bind def +/graphcolor { sethsbcolor } bind def +/nopcolor {pop pop pop} bind def + +/beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if +} bind def + +/set_font { + findfont exch + scalefont setfont +} def + +% draw text fitted to its expected width +/alignedtext { % width text + /text exch def + /width exch def + gsave + width 0 gt { + [] 0 setdash + text stringwidth pop width exch sub text length div 0 text ashow + } if + grestore +} def + +/boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath +} bind def + +/ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix +} bind def + +/endpage { showpage } bind def +/showpage { } def + +/layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] +def + +/layerlen layercolorseq length def + +/setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def +} bind def + +/onlayer { curlayer ne {invis} if } def + +/onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if +} def + +/curlayer 0 def + +%%EndResource +%%EndProlog +%%BeginSetup +14 default-font-family set_font +1 setmiterlimit +% /arrowlength 10 def +% /arrowwidth 5 def + +% make sure pdfmark is harmless for PS-interpreters other than Distiller +/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse +% make '<<' and '>>' safe on PS Level 1 devices +/languagelevel where {pop languagelevel}{1} ifelse +2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put +} if + +%%EndSetup +setupLatin1 +%%Page: 1 1 +%%PageBoundingBox: 36 36 294 187 +%%PageOrientation: Portrait +0 0 1 beginpage +gsave +36 36 258 151 boxprim clip newpath +1 1 set_scale 0 rotate 40 41 translate +% regex +gsave +0 0 0 nodecolor +14 /Times-Roman set_font +8 12.9 moveto 50 (\(A|B\)*C) alignedtext +grestore +% q0 +gsave +0 0 1 nodecolor +125 56 20.8 20.8 ellipse_path fill +1 setlinewidth +filled +0 0 0 nodecolor +125 56 20.8 20.8 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +117 50.9 moveto 16 (q0) alignedtext +grestore +% q0->q0 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 121.32 76.86 moveto +120.92 86.54 122.15 95 125 95 curveto +126.74 95 127.87 91.86 128.4 87.22 curveto +stroke +0 0 0 edgecolor +newpath 131.91 86.95 moveto +128.68 76.86 lineto +124.91 86.77 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 131.91 86.95 moveto +128.68 76.86 lineto +124.91 86.77 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +115.5 97.4 moveto 19 ('A') alignedtext +grestore +% q0->q0 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 111.79 72.34 moveto +102.41 91.18 106.81 113 125 113 curveto +140.2 113 145.78 97.75 141.72 81.74 curveto +stroke +0 0 0 edgecolor +newpath 144.98 80.49 moveto +138.21 72.34 lineto +138.43 82.93 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 144.98 80.49 moveto +138.21 72.34 lineto +138.43 82.93 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +116 115.4 moveto 18 ('B') alignedtext +grestore +% q1 +gsave +0 0 1 nodecolor +225 56 20.8 20.8 ellipse_path fill +1 setlinewidth +filled +0 0 0 nodecolor +225 56 20.8 20.8 ellipse_path stroke +1 setlinewidth +filled +0 0 0 nodecolor +225 56 24.8 24.8 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +217 50.9 moveto 16 (q1) alignedtext +grestore +% q0->q1 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 146.21 56 moveto +158.85 56 175.21 56 189.75 56 curveto +stroke +0 0 0 edgecolor +newpath 189.94 59.5 moveto +199.94 56 lineto +189.94 52.5 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 189.94 59.5 moveto +199.94 56 lineto +189.94 52.5 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +164 58.4 moveto 18 ('C') alignedtext +grestore +% start +gsave +0 0 0 nodecolor +33 56 1.8 1.8 ellipse_path fill +1 setlinewidth +filled +0 0 0 nodecolor +33 56 1.8 1.8 ellipse_path stroke +grestore +% start->q0 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 34.92 56 moveto +42.48 56 70.91 56 93.83 56 curveto +stroke +0 0 0 edgecolor +newpath 93.88 59.5 moveto +103.88 56 lineto +93.88 52.5 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 93.88 59.5 moveto +103.88 56 lineto +93.88 52.5 lineto +closepath stroke +grestore +endpage +showpage +grestore +%%PageTrailer +%%EndPage: 1 +%%Trailer +end +restore +%%EOF
--- a/paper.tex Sat Aug 14 01:33:24 2010 +0900 +++ b/paper.tex Sun Aug 15 09:51:05 2010 +0900 @@ -71,8 +71,9 @@ 言語を提案している.Continuous bsed C は ステートメントより大きく, 関数よりも小さなプログラ ミング単位としてコードセグメントを持ち, コードセグメントからの継続を基本としている. 本研究では, 与えられた正規表現から, 等価な 有限状態オートマトンに変換し, -オートマトンにおける状態遷遷移を Continuous based C/Cによる継続/関数呼び出 -しに変換する正規表現コンパイラを Python で実装した.} +オートマトンにおける状態遷遷移を Continuous based Cによる継続に変換する +正規表現コンパイラ を Python で実装した. なお, ここで言うコンパイルは, +内部形式/中 間表現への変換だけでなく,実行時バイナリの生成までを指す.} % \maketitle @@ -144,45 +145,50 @@ 正規表現は等価なNFAに, またNFAは等価なDFAに変換することが可能である\cite{U}. 以 下にその変換手方を説明する. -\subsection{正規表現からNFAへの変換} -NFA({\it Non-deterministic finite-state machine}) は, 入力に対して複数の -遷移先持つ状態の集合であり, 遷移先が非決定的(Non-deterministic)である. - -正規表現が, 等価なNFAに変換できるということを,\ref{subsection:regex}で定義 -した3つの演算について対応するNFAに変換できることから示す. - -\begin{enumerate} -\item {連接} 図\ref{figure:concat}は正規表現 ``AB'' に対応するNFAとなる. -\item {集合和} 図\ref{figure:union}は正規表現 ``$A|B$''に対応するNFAとなる. -\item {閉包} 図\ref{figure:star}は正規表現 ``A*''に対応するNFAとなる. -\end{enumerate} - -\begin{figure}[tH] +\begin{figure}[b] \begin{center} -\scalebox{0.60}{\includegraphics{fig1.eps}} +\scalebox{0.50}{\includegraphics{fig1.eps}} \end{center} \caption{``$A$''と``$B$''の連接} \label{figure:concat} \end{figure} - -\begin{figure}[tb] +\begin{figure}[b] \begin{center} -\scalebox{0.60}{\includegraphics{fig2.eps}} +\scalebox{0.50}{\includegraphics{fig2.eps}} \end{center} \caption{``$A$''と``$B$''の集合和} \label{figure:union} \end{figure} - -\begin{figure}[tb] +\begin{figure}[b] \begin{center} -\scalebox{0.60}{\includegraphics{fig3.eps}} +\scalebox{0.50}{\includegraphics{fig3.eps}} \end{center} \caption{``$A$''の閉包} \label{figure:star} \end{figure} +\subsection{正規表現からNFAへの変換} +NFA({\it Non-deterministic Finite Automaton}) は, 入力に対して複数の +遷移先持つ状態の集合であり, 遷移先が非決定的(Non-deterministic)である. +ここでは, NFAを5個組$(Q, \Sigma,, \delta, q_0, F)$で定義する.ただし, +\begin{enumerate} +\item $Q$は状態の有限集合. +\item $\Sigma$は入力記号の有限集合. +\item $q_0$は$Q$の要素で, 開始状態と呼ぶ. +\item $F$は$Q$の部分集合で,受理状態と呼ぶ. +\item $\delta$は,状態と入力記号に対して状態の集合を返す遷移関 + 数.($\varepsilon$遷移を許す) +\end{enumerate} +正規表現が, 等価なNFAに変換できるということを,\ref{subsection:regex}で定義 +した3つの演算について対応するNFAに変換できることから示す. +\begin{enumerate} +\item {連接} 図\ref{figure:concat}は正規表現 ``AB'' に対応するNFA. +\item {集合和} 図\ref{figure:union}は正規表現 ``$A|B$''に対応するNFA. +\item {閉包} 図\ref{figure:star}は正規表現 ``A*''に対応するNFA. +\end{enumerate} + 図\ref{figure:union}, \ref{figure:star}において, ラベルのない矢印は無条件 -の遷移を現しており,$\varepsilon$-動作と呼ばれる. また, 二重丸で囲まれた +の遷移を現しており,$\varepsilon$遷移と呼ばれる. また, 二重丸で囲まれた 状態は受理状態を現しておリ, NFAにおいて入力が終了した時点で,受理状態を保 持している場合に限り, その文字列を受理したことになる. なお, NFAは同時に 複数の遷移先をもつことがあるので, テキストのマッチング途中で複数の状態を @@ -196,40 +202,119 @@ 表現(``$a?$''は''a``か空文字''``を認識する拡張された正規表現お一つ)の評 価において, NFAベースの正規表現評価器では遷移する状態の数が増えてしまう でマッチングにかかる処理時間が$n$の指数的に増加する問題をベンチマーク -結果と共に指摘している. 文献\cite{K} では正規表現からNFAベースのマッチン -グ処理を行う IBM 7094 の機械語を生成する例が紹介されている. +結果と共に指摘している. 文献\cite{K} では正規表現からNFAベースで効率的な +マッチング処理を行う評価器をIBM 7094 機械語で生成する例が紹介されている. \subsection{NFAからDFAへの変換} 非決定的な遷移を行うNFAから, 決定的な遷移を行うDFA({\it Deterministic -finite-state machine})に変換する手法を説明する. なお, 遷移が決定的である +Finite Automaton})に変換する手法を説明する. なお, 遷移が決定的である ということは, 1つの入力に対して, 遷移する状態がただ1つであるということを 指す. +DFAは, NFAと同様な5個組で$(Q, \Sigma,, \delta, q_0, F)$定義できる. ただ +し,DFAにおいて$\delta$において$\varepsilon$遷移は認められず, また任意 +の状態$q$と入力$\sigma$について, $\delta(q, \sigma) = q'$となる$q'$は$Q$ +の要素となる. つまり, 遷移先が決定的であるということに他ならない. -NFAからDFAの変換には, 部分集合構成法(\it{subset construction})と呼ばれる -方法を利用する. 部分集合構成法では, NFAの ``同時に遷移する可能性のある状 -態の集合''をDFAにおける ``状態''として扱う. - -!NFA, DFA の説明をもっと形式的に行います....! +以下に$\varepsilon$遷移を許す$\varepsilon$-NFA $E = (Q_E, +\Sigma,\delta_E, q_0, F_E)$ から等価なDFA $D = (Q_D, \Sigma, +\delta_D, q_D, F_D)$を構成する手順を示す. -\subsection{DFAから実行バイナリの生成}\label{subsection:compile} -DFAからの実行バイナリ生成には, 3種類の実装を行った. \begin{enumerate} -\item ({\bf DFA -> Continuous based C -> gccによるコンパイル}) -\item ({\bf DFA -> C -> gccによるコンパイル }) -\item ({\bf DFA -> LLVM 中間表現 -> LLVMによるコンパイル}) +\item $Q_D$は$Q_E$の部分集合全から成る集合であり, おの中で$D$において + 到達可能な状態は, $\varepsilon$遷移に関して閉じている$Q_E$の部分 + 集合$S$に限られる. ここで, 状態$q$において$\varepsilon$遷移に関し + て閉じている集合全体を$ECLOSE(q)$と表す. $ECLOSE$を使って$S$を定義 + すると, $S = \displaystyle\bigcup_{q\in{S}}ECLOSE(q)$を満たす$S$. +\item $q_D = ECLOSE(q_0)$. すなわち, $E$の開始状態の$\varepsilon$閉包. +\item $F_D$は$E$の状態の集合で,受理状態を少なくとも一つ含むもの全体から + なる集合である. すなわち,$F_D = \{S | S \in Q_D \wedge S \cap F_E \ne + \emptyset\}$ +\item $\delta_D(S, a)$は$Q_D$の要素$S$と$\Sigma$の要素$a$に対して次のよ + うに計算される. + \begin{enumerate} + \item $S = \{p_1,p_2,...,p_k\}$とする. + \item $\displaystyle\bigcup^{k}_{i=1}\delta(p_i,a)$を求め, その結 + 果を$\{r_1,r_2,...,r_m\}$とする. + \item このとき, $\delta_D(S, a) = \displaystyle\bigcup^{m}_{j=1}ECLOSE(r_j)$ + \end{enumerate} +\end{enumerate} +この方法によって得られたDFA $D$はNFA $E$と同等の言語を認識し, またNFAの +元となる正規表現と同等である. + +\subsubsection{DFAから実行バイナリの生成}\label{subsection:compile} +DFAからの実行バイナリ生成には, 2種類の実装を行った. + +\begin{enumerate} +\item DFA $\rightarrow$ Continuous based C $\rightarrow$ gccによるコンパイル +\item DFA $\rightarrow$ LLVM-API $\rightarrow$ LLVMによるコンパイル \end{enumerate} % +以下, Continuous based C, LLVMそれ自身の説明と, それを利用したDFAからの +実行バイナリ生成の方法を説明する. + +\subsubsection{Continous based C} +Continous based C(以下CbC)は, ... +本研究室での先行研究によりCbCコンパイラは, GNU C Compiler上で実装されて +いる\cite{Y},本研究ではgcc-4.5上に実装されたCbCコンパイラを用いた. + +以下に, 正規表現 ``$(A|B)*C$''に対応するDFAと, DFAの各状態に対応するCbC +のコードセグメントの生成例を示す. + +\newpage +\begin{figure}[t] +\begin{center} +\scalebox{0.60}{\includegraphics{fig5.eps}} +\caption{正規表現``$(A|B)*C$''に対応するDFA} +\label{figure:dfasmaple} +\end{center} +\end{figure} + +\begin{center} +\begin{small} +\begin{verbatim} +__code state_0(unsigned char *s, unsigned + char* cur, unsigned char* buf, FILE + *f, char* filename) { + switch(*s++) { + case 65: /* match A */ + goto state_0(s, cur, buf, f, filename); + case 66: /* match B */ + goto state_0(s, cur, buf, f, filename); + case 67: /* match C */ + goto state_1(s, cur, buf, f, filename); + default: goto reject(s, cur, buf, f, filename); + } +} +__code state_1(unsigned char *s, unsigned + char* cur, unsigned char* buf, FILE + *f, char* filename) { + goto accept(s, cur, buf, f, filename); +} +\end{verbatim} +\end{small} +{\bf 図\ref{figure:dfasmaple}のDFAに対応するCbCコードセグメント} +\end{center} +DFAの遷移とは直接関係のない引数(ファイル名やバッファへのポインタ等) が目 +立が, CbCでは環境をコードセグメント間で引数として明示的に持ち運ぶ軽量継 +続を基盤としたプログラミングスタイルが望ましい. 今回コンパイラによって生 +成したCbCソースコードでは,大域変数は持たず,必要な変数は全て引数に載せて +いる. +CbCのstate\_1, state\_0から呼ばれているaccept, rejectはそれぞれ受理状れ受 +理と非受理を表す. accept ではテキスト行を出力して次の行へ, rejectでは次 +の文字へと処理を移すコードセグメントへ継続を行う. + +生成したCbCソースコードを, GCC上に実装したCbCコンパイラによってコンパイルす +ることで実行バイナリを得る. + +\subsubsection{LLVM} +LLVM(Low Level Virtual Machine) は + \section{評価} - +\section{まとめと今後の課題} \begin{adjustvboxheight} % needed only when Appendix follows \begin{thebibliography}{99} -\bibitem{U} Hopcroft, J, E. Motowani, R. D, Ullman. : オートマトン言 - 語理論計算論I (第二版), pp.~39--90. - -\bibitem{K} Thompson, K : Regular Expression Search Algorithm, 1968 - \bibitem{R1} Cox, R : Regular Expression Matching Can Be Simple And Fast, 2007 @@ -238,8 +323,15 @@ \bibitem{R3} Cox, R : Regular Expression Matching in the Wild, 2010 +\bibitem{U} Hopcroft, J, E. Motowani, R. Ullman, J. : オートマトン言 + 語理論計算論I (第二版), pp.~39--90. + +\bibitem{K} Thompson, K : Regular Expression Search Algorithm, 1968 + \bibitem{H} 長谷川 勇 : 国際正規表現ライブラリの開発 +\bibitem{Y} 与儀 健人 : 組込み向け言語Continuation based CのGCC上の実装, 2010 + \end{thebibliography} \end{adjustvboxheight} % needed only when Appendix follows