概要: Pegex と TestML を使った言語非依存パーサ文法定義
こんにちま!
最近 ネット紛争地帯にホースで水を撒いてた にゃるらコト岡村 直樹(24)です。 涼しくなってきた昨今、いかがお過ごしでしょうか。
僕はこの間の診察のとき、ドクターから薬かえない? みたいな話をされて、 薬かえて様子みてたらちょっと気分の落ち込みがよくなってきた感じで、 ちょっと意欲の方も回復しつつあります。
で、いろいろあって、小説書きたい! 軽量マークアップ言語で! とか思ったんですが、いかんせん青空文庫形式は冗長でめんどいし、 あと普段書き慣れてる(Multi)Markdown はルビサポートしてないしで、 どうしたもんかと思ってました。
んで、それなら自分で作るかねー、昔その作業やってたことだし! とか思っていろいろ調べた所、我らが Ingy döt Net 先生の、
がすごい面白かったので紹介したいと思います。
Pegex と TestML について
Pegex
というのは何かというと、簡単にいえば言語非依存なパーザを作る、
パーザジェネレータらしきもので、結構モダンな感じのシロモノです。
で、このPegex
、一番の特徴は多分 言語非依存 というところで、
一度この Pegex 形式の grammer を書けば、Pegex が対応している言語で、
grammer を使い回せる! というのが一番良いところではないかと思います。
で、次にTestML
は、これまた言語非依存のテストを書く、
というのに使うツールで、Pegex
のテストでもこれが使われてます。
さらにこのTestML
のtml
ファイルの文法は、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 の話でした。
この二つ、なかなか面白いからみんなも見てみるといいよ!
#FIXME