kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Macro PEG 0.0.6 リリース

もはやDaily Releaseになってきたので、Daily Buildをスナップショットで提供だけでいいんじゃないかとかそういう気がしてきましたが、まあ練習と思ってしばらく継続していく予定です。

しかし、そろそろsbt-release使ってリリース自動化すべきときですね。

今回のリリースの変更点はだいたいこの辺↓:

Macro PEGのパーザはscala-parser-combinators使って作成しているのですが、構文解析エラーに関してはあまり賢くないので、文法作成者がある程度手動で、「ここはバックトラックしないで一気にエラーにしてね」と手動で教えてあげる必要があります。その辺やるのが commitメソッドだったり、!~演算子だったりします。この辺使い込んでる人あまり居ないんじゃないかという気がします。fastparseもCut演算子もってて、この辺はPEGベースのパーザ(コンビネータ)は持っておくべき機構なのかもしれないですね。なお、自分が提案したCut in PEGは、Lexical Cut とでも呼ぶべきもので、commitやfastparseのCutと違って、大域的脱出ではなく、ローカルな脱出のみを提供します(でないと、PEGの意味論にうまくマッチしない)。Li HaoyiさんはfastparseへのCut導入にあたってCut in PEG参照してくださったようですが、この辺は大域脱出的カットの方が実用的だと判断されたのか、意味論が誤解されたのかどっちだろう。

今までスルーしてました。サンプルコードいじってて、スルーされると困るのでチェックを追加しました。とにかく自分でMacro PEGをいじって不具合洗い出したりしていこう。

あと、トップページ@cocoa_ruto君からもらった興味深いMacro PEGの例を追加しておきました。自然数の引き算や累乗をMacro PEGでできるという話です。