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