ここでは、Racc を使っていくうえで遭遇しそうなバグについて書きます。 ただ、徐々に減ってはいますが、現時点ではまだまだ racc 自身のバグの可能性も高いです。 もし「これはバグに違いない!」というエラーに遭遇したらメールをください。 そのときは、規則ファイルなどもつけてくださるようお願いします。
また、racc コマンドに -v オプションをつけてコンパイルすると、内部情報が "ファイル名.output" に出力されます。このファイルの情報はデバッグには 必須ですから、デバッグ中は常に -vg をつけてコンパイルすることをおすすめします。
どうしたらいいんでしょうねえ。
エラーメッセージに出てる行に文法の間違いがあります。 どこが間違ってるかは じっと見て考えましょう。
一番ありがちな問題は、衝突でしょうか。 衝突があると、racc がコンパイル後に「衝突がある」とメッセージを 出すのですぐわかります。.output ファイルにはさらに詳しい情報が出力されます。 それをどうやって解決するか、とかそういうことに関しては、それなりの本を読んでください。 とてもここに書けるような単純な話ではありません。例えば O'Reilly の「lex & yacc」。
いまだ自分でも忘れることが多いのが、「スキャンが終了したら[false,なにか]を送る」 ということです。0.10.2 からは一回送ったらもうそれ以上は next_token を呼びません。
racc に -g オプションをつけてコンパイルすると、デバッグ用のコードが付加されます。 ここで、パーサクラスのインスタンス変数 @yydebug を true にしておいてから do_parse を呼ぶと、デバッグ用メッセージを出力します。パーサがシフト/還元していく 様子が直接見えますので、完全に現在の状態を把握できます。 どこで止まっているのかがわかればあとは直すだけ。
yacc では % がいっぱいでてきますが、racc では % は出てきません。 それから、C では変数に型があるためにそれを指定する文法がたくさんありますが、 Ruby は型無しですからそっち関係のものはなくなっています。
yacc では終端記号(トークン)を事前に指定しますが、 Racc では左辺にこないものを自動的に終端記号とみなします。 ということはつまり、非終端記号 nonterm を noterm と書きまちがったがために、 それが終端記号とみなされて、妙なことになる可能性があるということです。 これを防止するためには、.output ファイルを出力させて、変なものが終端記号になって いないか(もちろんその逆も)チェックするとよいでしょう。
バージョン 0.10 からは全体の構造が class ... rule ... end のようになりました。
規則部分は yacc とほぼ同じです。
%prec は = をつかいます。
yacc ではコメントは /* ... */ だけですが racc では #...(行末) もあります。
yacc ではユーザーコードを分類する必要はありませんが、racc ではパーサがクラスなので、 配置する場所によってユーザーコードを分類しています。ユーザーコードの指定方法も 0.9 で ---- を使うように大きく変わったので気をつけてください。
Copyright (c) 1999-2001 Minero Aoki <aamine@loveruby.net>