Mercurial > hg > Papers > 2021 > anatofuz-master
diff paper/chapter/04-interface.tex @ 85:c6c4b103c705
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Feb 2021 11:35:29 +0900 |
parents | 88ae1e4d83c6 |
children | eff53884ce6c |
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex Fri Feb 05 11:01:56 2021 +0900 +++ b/paper/chapter/04-interface.tex Fri Feb 05 11:35:29 2021 +0900 @@ -137,7 +137,24 @@ \subsection{Gears::Interfaceの構成} Gears::InterfaceはPerlのモジュールであるが、 実際はパーサー用のAPIを提供しているサブルーチンのまとまりである。 その為オブジェクトを作らずに直接メソッドを呼び出して利用する。 +Gears::Interfaceは2種類のAPIを提供している。 +\subsection{parse API} +1つは\texttt{parse}メソッドである。これはパースしたいファイル名を与えると、Interfaceであった場合にヘッダファイルをパースして情報を返すAPIである。 +parseAPIでStack Interfaceをパースした結果の値をソースコード\ref{src:parsedStack1}に示す。 +これはPerlの連想配列のリファレンスで表現されている。 +\lstinputlisting[label=src:parsedStack1, caption=parseAPIでパースしたStack Interface]{src/parsedStack1.pl} +contentが持つ要素は配列であり、 これはInterfaceをCbCの構造体に変換した際の内容である。 +file\_nameにはパースしたファイルのパスが入る。 +inner\_code\_gearsは、 Interfaceが継続として受け取るCodeGearの集合が入っている。 +StackではnextとwhenEmptyは入力で受け取るため、 inner\_code\_gearsに格納されている。 +nameはファイルパスではなく、 Interfaceの名前が格納されている。 + +ImplファイルであるSingleLinkedStack.hをパースした結果をソースコード\ref{src:parsedSingleStack}に示す。 +\lstinputlisting[label=src:parsedSingleStack, caption=parseAPIでパースしたSingleLinkedStack]{src/parsedSingleLinkedStack.pl} +ほとんど返す値はInterfaceの時のものと同様であるが、 Implの場合はisaキーに、実装しているInterfaceの名前が格納される。 + +この情報はパース対象がInterface、もしくはImplementでなければ返さない。 パーサーはInterfaceであるかどうかを、構文の正規表現にマッチするかどうかで確認をする。(ソースコード\ref{src:IsInterface}) \lstinputlisting[label=src:IsInterface, caption=Interfaceであるかどうかの確認]{src/IsInterface.pm}