字句解析に使うために、ファイルアクセスに字句解析特有の
ランダムアクセス機能を持っています。
- 字句解析は、次のステップのパターンに基づくことによって、
部品化を進めることが出来ます。
- 1.フェッチ・フェーズ; トークンのタイプを決定する、アクションする対象を入力する
- 2.アクション・フェーズ; トークンタイプに応じたアクションをする
- 3.ネクスト・フェーズ; ファイルポインタを進める
- ユーザは、1,3.の関数を作成し、その関数と 2.を含む字句解析関数を
作成します。
- 1,3.の関数内で呼び出す(委譲する)部品をサブレックスと呼びます。
サブレックスは、トークンタイプの解析とセンテンスの解析を行います。
- 字句は、次のタイプによって識別します。
- トークン; 最小単位、ファイルポインタを進める単位
- トークンタイプ; トークンのタイプ、多重適用される
- センテンス; トークンの集まり、意味を持った範囲
- トークンは、文字や文字タイプの組み合わせによって定義されます。
- トークンタイプは、表示可能タイプ、コメント・センテンス開始タイプ
のように、複数のタイプに当てはまることがあります。
フェッチフェーズで、現在のファイルポインタの位置のトークンの
トークンタイプを決定します。トークンタイプは、後のトークンを
調べることで決定するものもあります。(前のトークンを記録して
おいて決定するとプログラムが煩雑になります)
- センテンスは、括弧内部、ブロック、エリアなど、複数のトークンです。
括弧タイプ・センテンスは、センテンス開始
トークン、〜終了トークンから構成されます。フェッチ・フェーズで
〜開始トークンを、ネクスト・フェーズで〜終了トークンを判定します。
- サブレックスには、現在のファイルポインタにあるトークンが
(何のトークンタイプで)何のセンテンスなのかという情報を
持っています。アクション・フェーズでは、その情報から
条件分岐してそれぞれのアクションをします。
- 出力ではなく、入力についてのデータを定義します。
- サブレックス関数は、次のインターフェイスを持つようにします。
- void SubLex_init( SubLex* );
- void SubLex_fetch( SubLex*, BLex2* );
- void SubLex_nextFetch( SubLex*, BLex2* );
SubLex_fetch は、ユーザが作成したフェッチ・フェーズから
呼び出します。 SubLex_nextFetch は、ユーザが作成した
ネクストフェーズから呼び出します。ファイルポインタを
進める前に呼び出します。
- ユーザが作成する字句解析クラスは次のインターフェイスを持つように
するとよいでしょう。
- void Lex_init( Lex*, ... );
- bool Lex_fetch( Lex* ); フェッチフェーズ、返り値は false=EOF
- void Lex_next( Lex* ); ネクストフェーズ
- void Lex_finish( Lex* );
ユーザが最終的に作成する処理関数は、これらの関数を用いて、
アクションを記述するとよいでしょう。
Lex は、BLex と必要なサブレックスを所有します。
written by M.Toda from Dec.28.1998