From: gotoken@... (GOTO Kentaro) Date: 1998-12-02T01:08:15+09:00 Subject: [ruby-list:11175] Re: parser ごとけんです In message "[ruby-list:11160] Re: parser" on 98/12/01, YANAGAWA Kazuhisa writes: >In message <199811290940.SAA27448@hanare00.math.sci.hokudai.ac.jp> >gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) writes: > > ちなみにどんなの書いたんでしょう? めちゃくちゃ手抜きな奴なら自分でも > 何度か書いているんですが.これがまた,拡張性も何もないんですよね.... > lex 並の記述から自動生成できるかも,というぐらいのことを意図して試し > に書いた,という側面もあるんですが. > > # おおむねこんな感じ. ぼくも lex みたく字句解析器を生成するものを最初考えたのですが めんどくさくなってやめてしまいました :-< > # 見ての通り一行ずつしか処理していないんで,"untermed-string" とか怪 > # しげな token をつくって使う時に何とかするという (^^; いやぁ、その辺どうするのがいいか分かんないですよね。 ちなみに、ぼくは lex の機能のうちスタート状態は あると便利だろうと思って、実装してみました。 こんなふうに使います: # C のコメントだけ抜き出す(文字列内の /* 非対応版) require "lax" include Racco l = Lax.new l.x("CMNT") # 排他的スタート状態 CMNT include_state_of l # 状態のスコープを取り込む l.rule(/\/\*/){ # コメントのはじまり l.echo l.BEGIN CMNT } l.rule(/.|\n/, CMNT){ # CMNT のとき、そのときに限り l.echo } l.rule(/\*\/\s*\n/, CMNT){ # CMNT のとき、そのときに限り l.echo l.BEGIN INITIAL } l.rule(/.|\n/){} # コメント以外はスキップ while gets l.match($_) end > 実は欲しいのは構文解析器よりも構文解析器の自動生成器.... yacc のよう > に.しかも動くだけではなく reasonable な cost-performance であること. そうそう、さいごの条件、ぢうようですね (^^; でも、 > yacc や bison を ruby で書くことはできるかもしれないけど,なんか意図 > したものに対して生成も実行も重すぎるような気がしてしまう.気がするだ > けだけど. この辺はやっぱり作って見ないことには分からないと思います。 以外とカシコイひと(!=俺)が作ると速いかも知れません。 > # 自分でやるもんじゃないと決めてかかっている節あり (^^; ちょっと期待してますですよん (^^;; -- gotoken 恥ずかしいけど見てみたいと言う奇特なひとのために こっそり置いときます。ドキュメントとかないですけど。 http://www.math.sci.hokudai.ac.jp/~gotoken/ruby/junk/lax/