
|
|
|
もくじ ・ 前のページ ・ 次のページ
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^ を弄り倒しているメソッド群は、以上のような処理を、他のトークンに対しても行っています。
もくじ ・ 前のページ ・ 次のページ
|
|