ここでは、Racc
を使っていくうえで遭遇しそうな問題について書きます。
エラーメッセージに出ている行番号のあたりを見て間違いを 探してください。ブロックを閉じる行でエラーになる場合は、 どこかで開き括弧などを増やしてしまっている可能性が高いです。
一番ありがちで一番面倒な問題は衝突 (conflict)
でしょう。
文法中に衝突があると、racc
はコンパイル後に
「5 shift/reduce conflict
」のようなメッセージを表示します。
-v
をつけると出力される .output
ファイルからはさらに詳しい情報が得られます。
それをどう使うか、とかそういうことに関しては、それなりの本を読んでください。
とてもここに書けるような単純な話ではありません。
当然ながら『Ruby を 256 倍使うための本 無道編』(青木峰郎著)がお勧めです。
racc
に -g
オプションをつけてパーサを出力すると、デバッグ用のコードが
付加されます。ここで、パーサクラスのインスタンス変数 @yydebug
を true
に
しておいてから do_parse/yyparse
を呼ぶと、デバッグ用メッセージが出力
されます。パーサが動作する様子が直接見えますので、完全に現在の状態を
把握できます。これを見てどこがおかしいのかわかったらあとは直すだけ。
いまだ自分でも忘れることが多いのが
「送るトークンが尽きたら [false,
なにか] を送る」ということです。
ちなみに Racc 0.10.2
以降では一度 [false,
なにか] を受け取ったら
それ以上 next_token
は呼ばないことが保証されています。
追記: 最近は [false,
なにか] ではなく nil
でもよいことになった。