もくじ前のページ次のページ
7.構文要素を扱う(1)
Delphi に付属のコードエディタでは read, write, index の語句が property 節の中でだけハイライト表示されています。また、asm, end で囲まれた複数行に渡る領域を指定色で表示しているにも関わらず、ブロック中の // コメントや (* *) { } を指定色で表示する機能が実現されています。

この機能を TEditor でも実現するため、構文要素(と私が勝手に呼んでいるだけですが)を扱うために導入されたのが、 TFountainParser の FElementIndex データフィールドです。 構文要素を取得する仕組みは、Brackets に良く似てはいますが、指定された語句によってだけ囲まれた領域を認識する Brackets よりも、より柔軟な要素を扱うことが出来ます。TDelphiFountain の AnkProc では、 PropertyBlockElement を解除するかどうかの判別を、end, function, private, procedure, protected, public, published という語句に対して行っています。

property 節内の read, write, index をハイライト表示する処理についてソースコードの流れを追いながら説明したいと思います。

まず property 節内であることを表現する構文要素を表す定数を定義します。

const PropertyBlockElement = 1;

次に、AnkProc を override して、構文要素の値に応じた case 文によって処理を分岐させます。まず、通常の構文要素内にある時( NormalElementIndex )は、FP^ が指している文字が P, p の場合、そこから始まる語句が property であるかどうかを判別し、真の場合は、ポインタをその語句の最後の位置まで進め( IsKeyWord メソッド参照)FElementIndex を PropertyBlockElement に更新します。次に AnkProc が実行される時は、PropertyBlockElement ブロックが実行されます。ここでは、property 節内でだけ有効なキーワードの場合は toReserve トークンを返す。あるいは property 節を終了させる語句の場合は、FElementIndex を NormalElementIndex で更新するといった処理が行われています。

property 節は通常語句 property で始まり、語句 ; で終了しますので、FP^ の文字が ; の場合は、property 節内であることを終了させる処理が必要になります。この処理は、PropetyCancelProc で行われています。InitMethodTable 内では FP^ が ; の場合、この PropertyCancelProc が実行されるように設定されています。

FMethodTable[';'] := PropertyCancelProc;

procedure TDelphiFountainParser.PropertyCancelProc;
// ';'
begin
  if FElementIndex = PropertyBlockElement then
    FElementIndex := NormalElementIndex;
  SymbolProc; // 普通の記号として扱う
end;

  asm, end ブロックもこの処理に準じます。



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


[PR]子育てママさんへ:3年毎に15万円うけとれる保険?