In message <36D4B03F275.F8A4.anakamur / exa.i-tech.co.jp>
中村暁史<anakamur / exa.i-tech.co.jp> writes:

> ->オブジェクト指向かどうかと、ungetが必要かどうかという問題は
> ->独立だと思います。
> 
> 構文を表現するオブジェクト群ツリーの中のどこに
> 次の単語(など)をattachするか?を決め兼ねてさまようことは
> あるでしょうけど、だからといってそれを「読む以前の状態に戻す」
> 必要はない、んではないかなと思ったもんで。

# 決め兼ねてさまようような文法は効率がひどく悪く,機械的な処理には向き
# ません,とか.

ということで,ふつう教科書的には「一トークン先読み」という手段を使って
ますよね.先読みしたトークンは別に保存しておく.

# で,「今見ているのはどのトークンだったっけ?」となやむ (^^;

さらにいったら今回のはパーザではなくスキャナの話で,「ある入力文字列か
らある部分文字列を取り出したい.ただしその部分文字列の直後が(また別の)
ある文字列である事」というのを実装しようとすると,先読みは本質的ですね.

"foobarbaz" から "foo","ba","rbaz" をトークンとして切り出す.ただし 
"ba" というトークンは "bar" の頭に文字である場合にしか切り出されない.
"foobar" なら "foo","ba","r" だが "foobaz" なら "foo","baz"にな
る.....っていうようなもの.

おまけに特定のフレームワーク(こんかいの場合は rlexの吐く Scanner)で
の話なので,ungets が必要になるのもわかるのですよ.

# ruby の正規表現で*`$&' に含まれない*後方依存文脈を書ければ話は別だっ
# た.lex だと `ba/r' なんて書けますね.たしか.


> 手続き指向で関数呼び出しによって動く言語(Cとか)でコンパイラを
> 作るときに特有、つーかそういう言語向けに処理手順を最適化した
> 結果として、「戻す」があるんだと、古典的な(つまりそーいう言語を
> 対象とした)コンパイラの作り方本を読んだときの俺の雑感です。

いやぁ,入力ストリームというオブジェクトに戻しているだけですね.さらに
戻さなくてもいいというのは前述の通り.


> だって手続き指向だと、読み元くらいしか、さまよったオブジェクト
> (じゃないけど)を一時的に持たせる場所がないんですもん(T_T)

だって読み元は立派にオブジェクトじゃないですか.オブジェクトを差別して
はいけません.

# ええもう,ruby でかいたら何でもオブジェクトですし (^^;

そもそもオブジェクトはさまよいませんし..... LL(oo) パーザとか LR(k)
パーザとかだとバックトラックするのでさまよう感じになりますが.

# 論理型言語によるパーザとか,pure な関数型パーザとか,もっと良くわか
# らない計算原理に基づいたパーザとかでは他にオブジェクトを持たせる場所
# がある,という主張でしょうか,とか (^^;

-- 
柳川和久 @ 東大阪市 . 大阪府                              February 25, 1999
Youth comes but once in a lifetime.