Rzubr に spec ファイル追加

Rzubr - ピュア Ruby なおもちゃの LALR(1) 構文解析器 - Tociyuki::Diary」の続きです。

https://github.com/tociyuki/rzubr-ruby

  1. LALR(1) 構文解析表を作成した後に、無限ループのチェックをするようにしました。チェックのやりかたは2種類で、一つは、ACTION テーブルに本来ありえない空の行ができてしまったときと、ある終端記号が還元してもシフトしないときです。後者は、いつまでたってもシフトされずに入力記号列の先頭に終端記号が残ったままになるケースです。
  2. LALR(1) 構文解析表を項集合と共に Yacc の .output ファイルに似た形式の出力をおこなうメソッドを追加して、異常を検出したときにリストを出力するようにしました。
  3. 構文解析器のテストをどう記述したら良いのかわからず、先達の GNU Bison や Racc のテストを調べてみたら、四則演算をさせてみて正しい結果が得られるかどうか程度で良いようだとわかり、コーディング中の動作チェックに使っていた加減算の構文等を流用し、spec ファイルに仕立て上げることにしました。gemspec と Rakefilerspec 関連の記述を追加してテストできるようにしてコミットしました。

spec ファイルの役割は、それぞれ次のようになっています。

  1. calc_spec.rb - 加算と乗算の中置記法の式をあいまいでない LALR(1) 文法で記述したものです。
  2. prec_spec.rb - 上と同じであいまいな文法で記述したものを優先度で衝突を解決したものです。
  3. reduce_spec.rb - 前置式で括弧を使わずに式の入れ子関係を表す構文を LALR(1) 文法で記述したものです。
  4. rrconflict_spec.rb - 還元/還元衝突を検出して致命的エラーの例外を発生できるかチェックします。
  5. infinite_spec.rb - 無限ループを検出できるかチェックします。