もくじ前のページ次のページ
3.NextToken メソッド
TFountainParser は、文字列からトークンを取り出す作業を行うクラスです。ですから、その実装はきわめてベタです。べたべたです。
コンストラクタで TFountain コンポーネントの実体を必要とするのは、ヘルプファイルの記述にある通りです。NewData メソッドで受け取った文字列を NextToken メソッドでパースしますが、その仕組みは、Delphi の Classes.pas にある TParser を参考にしています。文字列を1文字づつ判別していって、意味のあるトークンと思えるところで処理を中断し、その時点でのトークンを返します。判別処理を開始した時の最初の文字に対応する判別処理メソッドへ分岐する仕組みが FMethodTable と、それを初期化する InitMethodTable メソッドです。

type
  TFountainParseProc = procedure of object;

  これは、引数リストの無いオブジェクトのメソッドを扱うための型宣言です。例えば、
  
type
  TForm1 = class(TForm)
    ...........
    procedure Button1Click(Sender: TObject);
  public
    procedure AruShyori;
  end;

implementation

uses
  heFountain;

procedure TForm1.AruShyori;
begin
  ShowMessage('AruShyori called.');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Proc: TFountainParseProc;
begin
  Proc := AruShyori;
  Proc; // AruShyori 実行
end;


といったことが出来ます。

FMethodTable: array [#0..#255] of TFountainParseProc;

FMethodTable は上記 Proc の配列です。その添え字には、Char 型データ #0..#255 が指定されていますので、総ての Char 型データ(総ての文字)に対して TFountainParseProc 型メソッドを割り当てることが出来ます。InitMethodTable の実装部では、

  for C := #0 to #255 do
    case C of
      #0:   FMethodTable[C] := EofProc;
      #9:   FMethodTable[C] := TabProc;
      #10:  FMethodTable[C] := LFProc;
      #13:  FMethodTable[C] := CrProc;
      '0'..'9':
            FMethodTable[C] := IntegerProc;
      'A'..'Z', '_', 'a'..'z':
            FMethodTable[C] := AnkProc;
      .............
    else
            FMethodTable[C] := SymbolProc;
    end;
      
  というように、すべての文字に対してメソッドを割り当てています。この状態で、
  
var
  S: String;
  FP: PChar;
begin
  S := 'procedure TForm1.Button1Click(Sender: TObject);';
  FP := PChar(S);
  FMethodTable[FP^];
  
  としたとき、FP^ (FP が指している文字)は 'p' ですから、
FMethodTable['p'] に設定されている AnkProc が実行されます。AnkProc では

procedure TFountainParser.AnkProc;
// 'A'..'Z', '_', 'a'..'z':
begin
  FToken := toAnk;
  while FP^ in ['0'..'9', 'A'..'Z', '_', 'a'..'z'] do
    Inc(FP);
end;


という具合に、Token プロパティ値を toAnk に設定した後、 FP^ が文字集合 ['0'..'9', 'A'..'Z', '_', 'a'..'z'] に含まれている間ポインタを進めて次の文字を判別しています。ポインタが、語句 procedure の後の半角スペースを指した時ループを抜けます。
TFountainParser の FP^ を弄り倒しているメソッド群は、以上のような処理を、他のトークンに対しても行っています。


もくじ前のページ次のページ


[PR]話題の新車を無料プレゼント中:必ず当る抽選会!今すぐ応募で簡単GET