# HG changeset patch # User anatofuz # Date 1612495988 -32400 # Node ID eff53884ce6c16daf4949f03236610d2d975b723 # Parent c6c4b103c705e4ad57e45cb7fb234d681e90dc10 ... diff -r c6c4b103c705 -r eff53884ce6c paper/chapter/04-interface.tex --- a/paper/chapter/04-interface.tex Fri Feb 05 11:35:29 2021 +0900 +++ b/paper/chapter/04-interface.tex Fri Feb 05 12:33:08 2021 +0900 @@ -139,7 +139,7 @@ その為オブジェクトを作らずに直接メソッドを呼び出して利用する。 Gears::Interfaceは2種類のAPIを提供している。 -\subsection{parse API} +\subsection{パースAPI} 1つは\texttt{parse}メソッドである。これはパースしたいファイル名を与えると、Interfaceであった場合にヘッダファイルをパースして情報を返すAPIである。 parseAPIでStack Interfaceをパースした結果の値をソースコード\ref{src:parsedStack1}に示す。 これはPerlの連想配列のリファレンスで表現されている。 @@ -158,6 +158,23 @@ パーサーはInterfaceであるかどうかを、構文の正規表現にマッチするかどうかで確認をする。(ソースコード\ref{src:IsInterface}) \lstinputlisting[label=src:IsInterface, caption=Interfaceであるかどうかの確認]{src/IsInterface.pm} +\subsection{詳細なパースAPI} +parse APIはシンプルな結果を返していたが、 Interfaceに定義しているCodeGearの引数など、詳細な情報を取得したいケースがある。 +Gears::Interfaceに、詳細なパース用のAPIである\texttt{detailed\_parse} APIを用意した。 +先ほどのStack Interfaceをパースした結果をソースコード\ref{src:parsedStackDetail}に示す。 +新たな情報としてcodeNameが連想配列の要素に追加されている。(ソースコード2行目) +codeNameはCodeGearの名前がキーになっており、valueとして引数の文字列情報が\texttt{args}に、、 Interfaceの呼び出し時に必要な引数の個数が\texttt{argc}に設定される。 +これらの情報は配列codesからもアクセス可能となっている。(ソースコード48行目) +Interfaceが持つDataGearの一覧は、配列dataに格納される。(ソースコード62行目) + +OutputDataGearがあるCodeGearの一覧が、 hasOutputArgsに格納される。(ソースコード68行目) +codeNameと同様に、CodeGearの名前がキーとなっている。 +対応する値は、 出力する変数の名前と、その型の組のリストになっている。 + +\lstinputlisting[label=src:parsedStackDetail, caption=Stack Interfaceの詳細なパース]{src/StackParseDetail.pl} + + + \subsection{Interfaceパーサーの呼び出し} \lstinputlisting[label=src:createHeaderName2Info, caption=ヘッダファイルの名前とInterfaceのパース結果の対応リストの作製]{src/createHeaderName2Info.pl} diff -r c6c4b103c705 -r eff53884ce6c paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r c6c4b103c705 -r eff53884ce6c paper/src/StackParseDetail.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/StackParseDetail.pl Fri Feb 05 12:33:08 2021 +0900 @@ -0,0 +1,92 @@ +\ { + codeName { + clear { + argc 1, + args "Impl* stack,__code next(...)", + name "clear" + }, + get { + argc 1, + args "Impl* stack, __code next(union Data* data, ...)", + name "get" + }, + get2 { + argc 1, + args "Impl* stack, __code next(union Data* data, union Data* data1, ...)", + name "get2" + }, + isEmpty { + argc 2, + args "Impl* stack, __code next(...), __code whenEmpty(...)", + name "isEmpty" + }, + pop { + argc 1, + args "Impl* stack, __code next(union Data* data, ...)", + name "pop" + }, + pop2 { + argc 1, + args "Impl* stack, __code next(union Data* data, union Data* data1, ...)", + name "pop2" + }, + push { + argc 2, + args "Impl* stack,union Data* data, __code next(...)", + name "push" + } + }, + codes [ + [0] var{codeName}{clear}, + [1] var{codeName}{push}, + [2] var{codeName}{pop}, + [3] var{codeName}{pop2}, + [4] var{codeName}{isEmpty}, + [5] var{codeName}{get}, + [6] var{codeName}{get2} + ], + content [ + [0] "enum Code clear;", + [1] "union Data* stack;", + [2] "enum Code push;", + [3] "union Data* data;", + [4] "enum Code pop;", + [5] "enum Code pop2;", + [6] "union Data* data1;", + [7] "enum Code isEmpty;", + [8] "enum Code get;", + [9] "enum Code get2;", + [10] "enum Code next;", + [11] "enum Code whenEmpty;" + ], + data [ + [0] "union Data* stack;", + [1] "union Data* data;", + [2] "union Data* data1;" + ], + file_name "Stack.h", + hasOutputArgs { + get { + data "Data*" + }, + get2 { + data "Data*", + Data "union", + data1 "*" + }, + pop { + data "Data*" + }, + pop2 { + data "Data*", + Data "union", + data1 "*" + } + }, + inner_code_gears { + next 1, + whenEmpty 1 + }, + name "Stack" +} +