changeset 86:eff53884ce6c

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 05 Feb 2021 12:33:08 +0900
parents c6c4b103c705
children 5051bfd6b35f
files paper/chapter/04-interface.tex paper/master_paper.pdf paper/src/StackParseDetail.pl
diffstat 3 files changed, 110 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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}
 
Binary file paper/master_paper.pdf has changed
--- /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"
+}
+