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.