数週間前にここに書いた Perl 製の独自 Template parser ですが、いくつかバグを発見しました。まず、空の()のパースに失敗するということ、それと空の""を変数だと思ってパースしてしまうということです。
で、それを直そうと思って do{}while の中に次の token が ')' だったら last するというようなコードを書いたところ、ドラスティックにパースを失敗するようになりました。
頭の中で実行状態を辿っていっても、まったくおかしいところは見つかりません。仕方がないので printf デバッグに近いことをやっていたのですが、それを見ていてようやく気づきました。
do { } while ブロック中で last すると、親のブロックまで抜けてしまうんですね……(汗)。do ブロックをさらに空のブロックで囲って、なんとかうまくいきました。
do {} while は perl の言語仕様的にかなりトリッキーなことをやって実現しているという話は聞いていたのですが、こんな副作用があるとは。これだけのはまり度だと、もしかして perltrap に書いてあったりするんでしょうか。確認してみよう……
というわけで確認してみたところ、ありました。
うむ〜。言われてみれば、読んだことがあるような〜。