作者: 閑舎
日時: 2006/7/06(13:53)
うぇいく <weyk@...> さん wrote.

> いろいろな言語のパーサを思い起こすに、大抵は・・・・
> ・独立した関数である
> ・基底クラスの関数である
> のようです。なので、パーサに関しては、分散しない(できない)という
> ことで落ち着きそうです。

独立し、オブジェクトとは無関係に処理するほうが実は簡単であったりしますが、
ここはあくまで、クラスと関連づけながらやるとどうなるかということなので、
後者を選択したいところです。

ただ、例外がかなり発生することは確かで、それを全て基底クラスの parse 書
き換えで処理しようとすると頭がスパゲッティ状態になります。

で、下で言われているように、必要なら、子クラスで override が正解のようで
す(以下元のテキストは Wiki 風に書いてあるとします)。例えば、

*H1

と * で始まれば見出し。これはまだいいとして、

 1
  2

のように半角空白が続く限り pre である、が Wiki 風なので、そうなると、処
理が変わってきますよね。これは Pre というサブクラスで特別に書き下ろした
ほうが精神衛生上よろしい。基底を直して新たにエンバグしたりするともう;-)。

-one

という番号なしの箇条書きと

+one

という番号つきの箇条書きは全く同じ parse で問題なし。という感じですね。

> toTextについては、以下のいずれかになるかと思います。
> ・基底クラスに基本形を実装し、違うものはoverrideする
> ・基底クラスでは純粋仮想関数にし、全てで実装する
> ・基底クラスでは純粋仮想関数にし、中間的なsubクラスで実装し、各タグの
>  クラスは、中間的なsubクラスの子にする
> htmlのタグと展開という点では、最初の方法が良いと思いますが、
> どうでしょうか(もちろん、基底クラスへの実装には、bodyだからとか
> pだからといった例外処理は入れません。例外が必要なら、subClassでorverride
> する と。)

それで問題ないと思います。実際のところ toText は簡単なので、例外といって
も、IMG などの空タグは中身がない、PRE の場合中を下手に変換しない、という
くらいです。

> # 開くタグと閉じるタグがあるのが基本形ですかね?

厳密にいうと、タグには、

・閉じるがないもの
・閉じるが文脈上省略できるもの(ブラウザは当り前ですが、パーサ部で補って
  いる)

があります。toText の段階ではパーサの処理が終わっているので、まあ、あま
り問題はないんですけどね。

--
本田博通(閑舎)
テキストとスクリプトの http://www.rakunet.org/TSNET/