宣言セクションには、gperfの宣言を含めることができます。コマンドラインオプションと同様に、gperfの動作に影響します。実際、各宣言はそれぞれコマンドラインオプションに対応しています。宣言には次の3つの形式があります。
- ‘%compare-lengths’のような、引数を取らない宣言。
- ‘%switch=count’のような、引数を取る宣言。
- ‘%define lookup-function-name name’のような、出力ファイル内の要素の名前を指定する宣言。
同じ宣言を入力ファイルとコマンドラインオプションの両方で指定した場合は、コマンドラインオプションの値が優先されます。
次のgperf宣言を利用できます。
- ‘%delimiters=delimiter-list’
- キーワードとその属性を区切るための区切り文字を含む文字列を指定できます。デフォルトは「,」です。カンマや改行を含むキーワードを使うには、このオプションが必要です。
- ‘%struct-type’
- 生成コードに
struct型の宣言を含められます。例は前節を参照してください。
- ‘%ignore-case’
- ASCII文字の大文字と小文字を同等とみなします。文字列の比較では、大文字と小文字を区別せずに文字を比較します。ロケールに依存する大文字・小文字の対応は無視されることに注意してください。
- ‘%language=language-name’
- オプションの引数で指定した言語のコードを生成するよう、
gperfに指示します。現在対応している言語は次のとおりです。
- ‘KR-C’
- 旧式のK&R Cです。旧式のCコンパイラとANSI Cコンパイラで処理できますが、ANSI Cコンパイラでは‘const’がないため、警告やエラーが出ることがあります。
- ‘C’
- 共通のCです。ANSI Cコンパイラで処理できます。また、このキーワードを認識しないコンパイラ向けに
#define constで空の定義を与えれば、旧式のCコンパイラでも処理できます。
- ‘ANSI-C’
- ANSI Cです。ANSI C(C89、ISO C90)コンパイラ、ISO C99コンパイラ、C++コンパイラで処理できます。
- ‘C++’
- C++です。C++コンパイラで処理できます。
デフォルトはANSI-Cです。
- ‘%define slot-name name’
- この宣言が役立つのは、‘-t’オプション、または同じ働きをする‘%struct-type’宣言を指定した場合だけです。デフォルトでは、キーワードを格納する構造体メンバーの識別子を‘name’とみなします。このオプションで、そのメンバーの識別子を任意に選べます。ただし、指定した
structの最初のフィールドでなければならない点は変わりません。
- ‘%define initializer-suffix initializers’
- この宣言が役立つのは、‘-t’オプション、または同じ働きをする‘%struct-type’宣言を指定した場合だけです。空のハッシュテーブル項目で、slot-nameより後にある構造体メンバーの初期化子を指定できます。初期化子の一覧はカンマで始める必要があります。デフォルトでは、出力コードはslot-nameより後の構造体メンバーをゼロで初期化します。
- ‘%define hash-function-name name’
- 生成するハッシュ関数の名前を指定できます。デフォルトの名前は‘hash’です。このオプションにより、同じファイル内で2つのハッシュテーブルを使えます。
- ‘%define lookup-function-name name’
- 生成する検索関数の名前を指定できます。デフォルトの名前は‘in_word_set’です。このオプションにより、生成した複数のハッシュ関数を同じアプリケーションで使えます。
- ‘%define class-name name’
- このオプションが役立つのは、‘-L C++’オプション、または同じ働きをする‘%language=C++’宣言を指定した場合だけです。生成するC++クラスの名前を指定できます。デフォルトの名前は
Perfect_Hashです。
- ‘%7bit’
- 生成するハッシュ関数と検索関数に引数として渡す文字列がすべて、7ビットASCII文字(0..127の範囲のバイト)だけで構成されることを指定します。ANSI Cの
isalnum関数やisgraph関数は、バイトがこの範囲内にあることを保証しません。これを保証するのは、‘c >= 'A' && c <= 'Z'’のような明示的な検査だけです。
- ‘%compare-lengths’
- 文字列の比較を試みる前に、キーワードの長さを比較します。このオプションはバイナリ比較には必須です(4.3 NULバイトの使用を参照)。長さの異なるキーワードを
strcmpで比較しなくなるため、検索時の文字列比較の回数を減らせる場合もあります。ただし、検索テーブルの範囲が大きい場合、つまりswitchオプションの‘-S’または‘%switch’が有効でない場合は、‘%compare-lengths’を使うと生成するCコードのサイズが大幅に増える可能性があります。長さのテーブルが、検索テーブルの項目数と同じ数の要素を持つためです。
- ‘%compare-strncmp’
- 文字列比較に
strncmp関数を使うCコードを生成します。デフォルトではstrcmpを使います。
- ‘%readonly-tables’
- 生成するすべての検索テーブルの内容を定数、つまり「読み取り専用」にします。多くのコンパイラでは、テーブルを読み取り専用メモリに置くことで、より効率のよいコードを生成できます。
- ‘%enum’
- #defineの代わりに、検索関数内のローカルなenumを使って定数値を定義します。これにより、異なる検索関数を同じファイル内に置くこともできます。James Clark
<jjc@ai.mit.edu>に感謝します。
- ‘%includes’
- コードの先頭に、必要なシステムのインクルードファイル
<string.h>を含めます。デフォルトでは含めないため、コードをコンパイルできるように、利用者自身がこのヘッダーファイルをインクルードする必要があります。
- ‘%global-table’
- キーワードの静的テーブルを、検索関数の中に隠すデフォルトの動作ではなく、静的なグローバル変数として生成します。
- ‘%pic’
- 生成するテーブルを、共有ライブラリに組み込むために最適化します。生成コードを含む共有ライブラリを使うプログラムの起動時間を短縮します。‘%struct-type’宣言、または同じ働きをする‘-t’オプションも指定した場合、利用者が定義するstructの最初のフィールドの型は、‘char *’ではなく‘int’でなければなりません。実際の文字列ではなく、文字列プール内のオフセットを格納するためです。そのオフセットを文字列に変換するには、‘stringpool + o’という式を使えます。oはオフセットです。文字列プールの名前は、‘%define string-pool-name’宣言で変更できます。
- ‘%define string-pool-name name’
- ‘%pic’宣言、または同じ働きをする‘-P’オプションによって作る文字列プールの名前を指定できます。デフォルトの名前は‘stringpool’です。この宣言により、‘%pic’を使う場合に同じファイル内で2つのハッシュテーブルを使えます。‘%global-table’宣言、または同じ働きをする‘-G’オプションを指定した場合でも使えます。
- ‘%null-strings’
- 空のキーワードテーブル項目に、空文字列の代わりにNULL文字列を使います。実行時に検査と分岐の命令が1つ増えますが、生成コードを含む共有ライブラリを使うプログラムの起動時間を短縮します。ただし、‘%pic’宣言ほどの効果はありません。
- ‘%define constants-prefix prefix’
TOTAL_KEYWORDS、MIN_WORD_LENGTH、MAX_WORD_LENGTHなどの定数に付ける接頭辞を指定できます。このオプションにより、‘-E’オプション、または同じ働きをする‘%enum’宣言を指定しない場合や、‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも、同じファイル内で2つのハッシュテーブルを使えます。
- ‘%define word-array-name name’
- ハッシュテーブルを格納する生成配列の名前を指定できます。デフォルトの名前は‘wordlist’です。このオプションにより、‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも、同じファイル内で2つのハッシュテーブルを使えます。
- ‘%define length-table-name name’
- 長さのテーブルを格納する生成配列の名前を指定できます。デフォルトの名前は‘lengthtable’です。このオプションにより、‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも、同じファイル内で2つの長さのテーブルを使えます。
- ‘%switch=count’
- 生成するCコードで、配列の検索テーブルの代わりに
switch文方式を使います。入力ファイルによっては、必要な実行時間と記憶領域の両方を減らせます。このオプションの引数は、生成するswitch文の数を指定します。値が1なら全要素を含む1つのswitchを生成し、値が2なら各switchに要素の半分ずつを含む2つのテーブルを生成します。ほかの値でも同様です。多くのCコンパイラは、大きなswitch文のコードを正しく生成できないため、この指定が役立ちます。このオプションは、Keith Bosticによる元のCプログラムからも着想を得ました。
- ‘%omit-struct-type’
- 型の宣言を出力ファイルへ転送しないようにします。型がすでにほかの場所で定義されている場合に使ってください。