From: aamine@... Date: 1999-01-29T00:04:18+09:00 Subject: [ruby-list:11793] Re: [racc] help me あおきです。 In Mail "[ruby-list:11783] Re: [racc] help me " keiju@Rational.Com (石塚圭樹 ) wrote: > パーズそのものの速度は大部早いみたいですね. 処理はscannerのボトルネッ > クだけって感じです. みたいですね。 lexもどきの文法ファイルからCとRubyのソースを出力するとかも考えたの ですが、RubyのProcをよびだすコストが正規表現の速度差をうわまわったら 意味がないし。 Rubyでがんばる方向では、正規表現を複数回よびだすのをやめて /(\Apat1)|(\Apat2)|(\Apat3)|(\Apat4)|...|(\ApatN)/ でスキャンするとか。 それで、あとからどのカッコにマッチしたのか調べる。 モード変化は、Regexpをまるごととりかえてしまうことで実装。 MatchingDataに「nilでない最初の括弧」とかいう情報があると かなり高速になるんですけどね。(できるかな?もしかして) > >> # あと, もうちょっとraccのコンパイル速度が早くなると嬉しいんですが(^^;;; > > > >そうですね。最初にrtagsをコンパイルしたとき、あんまり時間がかかるんで > >無限再帰してるのかと思ってインタラプトかけちゃいました。 > >プロファイルとって調べてみます。 > > ありがとうございます(__;;; うう。いろいろやってみたのですが、アルゴリズムを変えない限り 今の速度で限界みたいです。これは明日にでも。 # bisonのコードでも見て勉強してきますです。 > rtags.ryの件は後半にあるほとんど無駄なトークンをscanner側で1つにしちゃ > えばきっと状態数がかなり少なくなるので, rtagsのパーズは早くなるとは思 > うのですが... そうですね。INTEGERとFLOATとXSTRINGと…あれ?即値全部かな > 色々試してみましたが, 再現しないですね... 上記のような話なのかも知れま > せんね. 再現したらまた連絡します. おねがいいたします。 > ところで, 生成したパーザで出てくるデフォルトのエラーのメッセージの意味 > が良く分からないのですが... > > Racc parse error > unexpected token '' > > LR state = 0136139127128136139131151136139123124136139117136139117136139106 > > ってなっている時, どういう意味になっているのでしょうか? すみません、parser.rbのバグでした。パッチつけます。 tokenが空文字列になってるほうはひきつづき調査中です。 ------------------------------------------------------------------- あおきみねろう@一橋大学 mail to: aamine@dp.u-netsurf.ne.jp website: http://www1.u-netsurf.ne.jp/~brew/mine ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --- parser.rb.org Thu Jan 28 20:22:28 1999 +++ parser.rb Thu Jan 28 20:26:15 1999 @@ -134,7 +134,7 @@ def on_error( etok, stat, sstack, vstack ) mes = "\n\nRacc parse error\n" mes << " unexpected token '#{etok}'\n\n" - mes << " LR state = #{stat}\n" + mes << " LR state = #{stat[-1]}\n" raise( ParseError, mes ) end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^