
|
|
|
もくじ ・ 前のページ ・ 次のページ
8.構文要素を扱う(2)直前のトークンの利用
5章でも少しだけ記述していますが、FElementIndex の他にもう一つのデータとして、直前のトークンを保持しておく FPrevToken データフィールドが用意されています。このデータによって、「ある構文要素中の、あるトークンに続くトークン」といったことを認識することが出来ます。THTMLFountain では、この方式で toTagElement, toTagAttribute といったトークンを取得しています。
THTMLFountainParser では、TagBlockElement を定義し、< で突入 > で解除という処理を行っています。ここまでは TDelphiFountainParser と同じですが、タグ中のトークンでは、その出現場所によってトークンの種類を判別する処理が行われています。この処理は override された NextToken で実行される UpdateTagToken メソッドで行われています。また NextToken メソッドでは現在のトークンを次回のパースで直前のトークンとして扱うために FPrevToken フィールドデータを更新していることにも注意して下さい。
procedure THTMLFountainParser.UpdateTagToken; begin if (FToken <> toEof) and (FElementIndex = TagBlockElement) then // toEof ではないタグ中のトークンの場合 case FPrevToken of // 直前のトークンが toTagStart: // < の直後の toAnk は toTagElement に変更 if FToken = toAnk then FToken := toTagElement; toDoubleQuotation, toTagElement, toTagAttributeValue: // "hoge", toTagElement, toTagAttributeValue の直後のトークンは // toTagAttribute に変更 FToken := toTagAttribute; toTagAttribute: // toTagAttribute 直後の = ではないトークンは toTagAttribute に // 変更 if FToken <> toTagAttributeDelimiter then FToken := toTagAttribute; end; end;
また、FP^ が = の時、toTagAttributeDelimiter とするかどうかの判別処理を行う TagAttributeDelimiterProc そして / の後に続く文字列を toTagElement とするかどうかを判別する SlashProc が InitMethodTable メソッドでそれぞれの文字に割り当てられていることを確認して見て下さい。
もくじ ・ 前のページ ・ 次のページ
|
|