カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

ingy製のPegexとTestMLが楽しいれす(^q^)

概要: PegexとTestMLを使った言語非依存パーサ文法定義


こんにちま!

最近ネット紛争地帯にホースで水を撒いてた にゃるらコト岡村 直樹(24)です。 涼しくなってきた昨今、いかがお過ごしでしょうか。

僕はこの間の診察のとき、ドクターから薬かえない? みたいな話をされて、 薬かえて様子みてたらちょっと気分の落ち込みがよくなってきた感じで、 ちょっと意欲の方も回復しつつあります。

で、いろいろあって、小説書きたい! 軽量マークアップ言語で! とか思ったんですが、いかんせん青空文庫形式は冗長でめんどいし、 あと普段書き慣れてる(Multi)Markdownはルビサポートしてないしで、 どうしたもんかと思ってました。

んで、それなら自分で作るかねー、昔その作業やってたことだし! とか思っていろいろ調べた所、我らがIngy döt Net先生の、

がすごい面白かったので紹介したいと思います。

PegexとTestMLについて

Pegexというのは何かというと、簡単にいえば言語非依存なパーザを作る、 パーザジェネレータらしきもので、結構モダンな感じのシロモノです。

で、このPegex、一番の特徴は多分言語非依存というところで、 一度このPegex形式のgrammerを書けば、Pegexが対応している言語で、 grammerを使い回せる! というのが一番良いところではないかと思います。

で、次にTestMLは、これまた言語非依存のテストを書く、 というのに使うツールで、Pegexのテストでもこれが使われてます。

さらにこのTestMLtmlファイルの文法は、Pegexで定義されてるっぽく、 なんだろう、一種の循環参照っぽくなっており大変面白いです。

PegexとTestMLを使ってみる

で、実際の使用例。

このブログにサンプルコードのせるのは面倒なんで、 僕の今回作ったリポジトリ、

を見てもらうと大変助かります。

でも一応サンプルはっておくと、Pegex

blosxom: -title -body

title:   /([^\n]+)\n+/

body:    /([\s\S]+)/

みたいな感じで、TestMLは、

%TestML 1.0

Title = 'Tests for parse blosxom format';
Plan = 1;

*input.parse('blosxom') == *output.yaml;

=== Parse blosxom format
--- input
This is title

This is test entry.
Hello blosxom world!
--- output
blosxom:
  - This is title
  - |
    This is test entry.
    Hello blosxom world!

みたいな感じ。

あ、ちなみにこのリポジトリは、blosoxm形式とplasxom形式のパーザー定義になります。

PegexとTestMLのはまりどころ

PegexとTestMLは使ってみないと楽しさがわからない面が多々あるかと思うんですが、 一個はまりどころがあって、それはドキュメントがきちんと整備されてません>_<;

いやーまあ、PegexもTestMLも開発途中っぽく、 そりゃ開発途中ならドキュメントなくてもしかないよねっていうのはわかるんですが、 PegexはCPANにリリースされてるPODに文法定義方法書いてないし、 TestMLは公式サイトに書いてあるシンタックスと、 実際の開発中のリポジトリで示されてるシンタックスが食い違っていて、 そこに俺は一時間ぐらいはまりました。/(^o^)\ナンテコッタイ

まあそれでもそこに目を瞑れば、結構いい感じなので、 一回見てみるといいんでないでしょうか。

というわけで結構いい加減な紹介でした。

何このいい加減な紹介……と思わないでもないですが(ぉぃ、 まあPegexとTestMLはこんな感じです。まあ細かい所は僕のリポジトリとか、 あるいはingy氏のサイトとか見ると良いと思います。

で、僕はこのPegexとかTestMLとか使って、 久しぶりに軽量マークアップ言語のパーザーでも書こうかなーと目論んでおります。

まあでも、昔Parse::RecDescentとか使ってたのはだいぶ昔のコトなんで、 今でもパーザ書き書きできるのかなーとか思わないでもないですが、 まあとりあえずそれはハマりながらでもやればいいかなーと思ってます。

っつーわけで以上、PegexとTestMLの話でした。

この二つ、なかなか面白いからみんなも見てみるといいよ!