これまで、MMLパーサの解析は、手書きのlexerで解析したトークン列を、これまた手書きのparserでツリー構築する形でやっていたのだけど、式の優先順位がめちゃくちゃだったので、リリース前に他を一切直さないとしても(そんなことはないのだけど)これだけはどうしても直したかった。で、parserだけであれば普通にyaccっぽく書いてしまえということで、jayのC#版(monoに入っているやつ)を使って書いてみた。
そしたらハマるハマる。parserの時点では、トークン列の処理はだいぶ気を使っていたつもりではあったのだけど、それでもconflictが生じたりはしている。今は落ち着いているように見えるので、conflictの深入りはしていない(重要な問題ではなさそうに見えるけど)。もっとも、ハマりにハマったのは、大抵自分の書いたjayのコードの問題なのだけど...まさにyak shaving。':' とか '|' が抜けるだけで全く意味が変わってしまうので、jayのデバッグ出力やjayで生成されたコードに追加できるデバッグ出力などを読んで、問題点を探す作業でだいぶかかってしまった。
ともあれ、これで、おもちゃ過ぎて笑えてしまうような大きな部分が無くなって一安心である。あとはmakeでちゃんとしたスクリプトを生成するようにしないと、まさに自分専用ツールになってしまうので、その辺を少しいじったらリリースしてもいいかもしれない。いやそうしたら英文のMMLイントロダクションを作成しないといけないのだけど...
昨日は、portmidi-sharpのサンプルに付けている仮想MIDIキーボードにも、多少ユーザビリティを改善してみた。これまでほとんどproof of conceptに過ぎなかったのだけど、MMLを書く時にコレは手放せないので、今後どんどん重要な存在になっていくはず(自分的に)。
次はとりあえず、MML入門テキストに追加していた時に気がついた、ピッチベンドをスペクトラムで指定していった時に変な発音命令が出ているという妙な問題を解決する必要がある。たぶん何かのマクロが競合して悪さしているのだろうとは思うけど。何となく、柔軟な文法の副作用が紛れ込んでいるような気がしてならない。
Leave a comment