データファイルにおけるデータ定義の文法を固定することにより
そのアナライズルーチンを共通化することを目的とする。
データ定義を構造化でき,型毎に取り出すことができる。
データ型名は任意の名前を付けることが出来る。
行連結文字'\'をサポート
行末に'\'があると次の行に続いているものとみなす。
プリプロセスによりマクロ処理をサポート
これにより繰り返し使用するようなデータも簡単に記述できる。
また,プリプロセスを済ましたデータはバッファに保持されるので
同じパラメータファイルを何度も読み込んでプリプロセスを実行しなくて済み
オーバーヘッドを大幅に削減できる。
プリプロセスを予め実行してファイルに保存しておけば
より一層効率が良くなるだろう。
真に高速化を求むならば,このモジュールは使わない方がいいだろう
直接Perlのデータを定義した方が格段に速い事は説明するまでも無い
プリプロセッサディレクティブには
#define, #undef, #if, #elseif, #else, #endif, #include
が定義されている。
&Params'LoadParameter(file-name, type, identifier-array, *member-list);
PreProcess
とGetData
を連続して実行する。
インターフェースとしては従来互換を保つ。
プリプロセスが完了したパラメータ配列は返さない。
file-name | : | データファイル(パスも含む) |
type | : |
ロードする型名 指定された型以外の物は格納されない |
*identifier-array | : |
識別子リストを格納する配列の参照 配列は初期化されずに識別子は追加されていく |
*member-list | : |
データ並びを格納する連想配列の参照 連想配列からデータ並びは識別子によって得られる。 データ並びは';'によってjoinされているのでsplitして使用する。 |
&Params'PreProcess(file-name, *parameter-buffer);
コメントの削除とプリプロセッサディレクティブを処理する。
file-name | : | データファイル(パスも含む) |
*parameter-buffer | : |
プリプロセスが完了したパラメータ配列を格納する配列の参照 このデータは GetData の引数として渡す。
|
&Params'GetData(*parameter-buffer, type, identifier-array, *member-list);
*parameter-buffer | : | プリプロセスが完了したパラメータ配列の参照 |
type | : |
ロードする型名 指定された型以外の物は格納されない |
*identifier-array | : |
識別子リストを格納する配列の参照 配列は初期化されずに識別子は追加されていく |
*member-list | : |
データ並びを格納する連想配列の参照 連想配列からデータ並びは識別子によって得られる。 データ並びは';'によってjoinされているのでsplitして使用する。 |
1カラム目に#があるとその行はコメントとみなされる。コメント行はどこにあってもよい。
定義はデータの型,識別子,データ並びによって構成される。
型と識別子はスペースにより区切られる。
データ並びの定義は名前の後の{で始まり,};で終わる。
データ並びは;で終わり一つのメンバが2行にまたがってはならない
#comments
type identifier{;
member-list;
・;
・;
};
type | : |
データ型名 名前として使用可能な文字は英数文字とアンダースコア 型名は行の空白文字を除く最初に無ければならない |
identifier | : |
識別子 名前として使用可能な文字は英数文字とアンダースコア |
member-list | : |
データ並び 一つのデータは2行にまたがってはならない デリミッターである;の前の空白文字は無視される。 データは一つも無くてもエラーにはならない |
#defineディレクティブはパラメータファイル中の定数に名前を与える。
#define命令には2つの構文がある。
#define 識別子 #define 識別子 トークン文字列
#defineディレクティブはそれ以降のパラメータファイル内に'%'で囲まれた
"%識別子%"を見つけると,それをトークン文字列で置き換える。
コメント行は置き換えの対象にならない
プリプロセッサディレクティブの行は既に定義済みの物に限り置き換え対象となる。
置き換えは一度しか行われない。(マクロ定義をネストしても展開されない)
また,"%識別子%"の置き換えは定義されていない場合
環境変数名の中に識別子を探し置き換えようとする。
識別子に使用可能な文字は英数文字とアンダースコアである。
#undefディレクティブは, #defineで定義した識別子を取り消す。
#undef 識別子
#undefディレクティブは,識別子に対する現在の定義を取り消す。
#ifディレクティブは#else, #endifディレクティブとともに使い
パラメータの処理を制御する。#ifの後に記述された式が真であるとき
#ifに続く文字列は有効になる。
#ifディレクティブを記述する場合,必ず対応する#endifを記述する必要がある。
一組の#if, #endifの間に任意の個数の#elseifディレクティブを記述できる。
#elseディレクティブは無くてもよいがif構文中一つまで記述できる。
if構文はネストができる。
構文: #if 式 文字列 #elseif 式 文字列 #else 文字列 #endif
式中ではプリプロセッサディレクティブdefinedによる特別な式を使える。
構文: defined (識別子)
この定数式は,識別子が#defineディレクティブによりもしくは環境変数において
定義されていれば真,定義されていなければ偽となる。
#includeディレクティブは,指定したファイルの内容を
#includeが記述された場所に取り込む。
取り込まれるインクルードファイルには同様にディレクティブを記述する事が出来る。
構文: #include ファイル名
コードを見てもらえば明白だがデータ切り出しの為のトークンは&Params'PreProcessを実行する前に
別のトークンに置き換えれば如何様にもできる。
トークンの変更はデータ中に干渉する文字列が含まれる場合などに有効だろう。