前田です。

2011年12月10日22:10 Yukihiro Matsumoto <matz / ruby-lang.org>:
> エラーのタイプは異なりますが、この変更は意図的です。ifでくくってあってもBEGINはコンパイル時に登録されます。ので、トップレベルでしか登録できないように文法が変更されました。

エラーメッセージがわかりにくくなっている気がするのですが、こんな感じで
エラーメッセージを表示してはどうでしょうか。

  https://gist.github.com/1455275

せめて、以下のパスは通らないので削った方がいいように思います。

			if (in_def || in_single) {
			    yyerror("BEGIN in method");
			}

-- 
Shugo Maeda