もくじ前のページ次のページ
6.新しいトークンの追加
THTMLFountain では、いくつかの新しいトークンが追加されていますが、ここでは toAmpersand を例として取り上げます。

toAnpersand は '&' で始まって 文字集合 ['#', '0'..'9', 'A'..'Z', 'a'..'z'] に含まれる文字の連続する文字列(だと思う)ですので、まず、InitMethodTable を override し、'&' に対応するメソッドを FMethodTable['&'] に登録する作業が必要になります。

inherited InitMethodTable; ............ FMethodTable['&'] := AmpersandProc;

これによって、NextToken メソッド実行時に FP^ が '&' の場合、AmpersandProc が実行されます。その実現部では、

procedure THTMLFountainParser.AmpersandProc;
begin
  FToken := toAmpersand;
  if not FIsStartToken then
    Inc(FP);
  while FP^ in ['#', '0'..'9', 'A'..'Z', 'a'..'z'] do
  begin
    Inc(FP);
    if FP^ = ';' then
    begin
      Inc(FP);
      Break;
    end;
  end;
end;


というように、現在のトークンを toAmpersand に設定し、上記文字集合からなる文字列を返す処理を行っています。

2行目の FIsStartToken がこの章の核心部分です。InitMethodTable メソッドでは、FTokenMethodTable['&'] := AmpersandProc; が実行されていることに注目してください。(HTMLFountain.pas 参照)つまり前章で述べた FTokenMethodTable に処理が委ねられた場合への対応も AmpersandProc で行っています。FInStartToken フィールドデータは、NextToken メソッドで FTokenMethodTable に処理が委ねられたことを示すフラグとして値が設定されています。フラグが真の場合 '&' で始まるトークンが折り返されているわけですから、パースする行文字列の先頭に '&' が存在することはあり得ませんので、そのための処理が行われています。

この例のように、一つのメソッドを共用することも(トークンの形式によっては)可能ですが、折り返されたトークンの処理を FTokenMethodTable に委ねる場合があるという仕様に変わりはありませんので、新しいトークンを定義した場合は、その取得方法のためのメソッドを FMethodTable に追加するか取得するための仕組みを実装すると同時に、折り返される可能性のあるトークンの場合は必ず FTokenMethodTable にも対応しなければなりません。toTagStart などのように1文字で構成されるトークンは、折り返されることがあり得ませんので対応の必要ありません。


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


[PR]看護師の好条件求人なら:転職のプロがサポート!年間5万人が利用