openpearでPHP製のPEGパーサコンビネータの1.0をリリースしました
http://openpear.org/package/PEG
openpearでPEGパーサコンビネータの1.0をリリースしました。
PEGパーサコンビネータとは、PEGパーサ同士を組み立てて構築するライブラリです。基本的なパーサを表現するオブジェクトを組み合わせてひとつのパーサを組み立てることが出来ます。
PEGパーサとはPEGで記述されるパーサの事です。PEGパーサは、無限の先読みが可能です。正規表現とは違って再帰的な文法を解釈するのも容易です。また、文法規則の優先順位が厳密に記述されるので曖昧ではありません。さらに、例えばLL(1)パーサ等と比べると、字句解析フェーズを必要としません。
PEGとはParsing Expression Grammer(解析表現文法)のことです。パーサが入力をどのように解釈するかを記述できる形式文法です。
簡易的なS式パーサの例
ドキュメントに載せている例を引用します。
簡易的なS式パーサです。シンボルとリストを解釈出来ます。
<?php include_once 'PEG.php'; // パーサの構築 $space = PEG::many(PEG::char("\r\n \t")); $symbol = PEG::join(PEG::many1(PEG::char("()\r\n\t ", true))); $paren = PEG::third('(', $space, PEG::many(PEG::ref($atom)), ')'); $atom = PEG::memo(PEG::first(PEG::choice($paren, $symbol), $space)); $sexpr = PEG::second($space, $atom); // コンテキストの構築 $context = PEG::context('(a (b (c ())))'); // コンテキストをパーサにかける $result = $sexpr->parse($context); // 結果 var_export($result); /* array ( 0 => 'a', 1 => array ( 0 => 'b', 1 => array ( 0 => 'c', 1 => array ( ), ), ), ) */
他にも、ドキュメントには四則演算の数式を逆ポーランド記法に変換する例や、CSS風の文法のパーサを作るチュートリアルなどが用意されています。
詳しいことは
ドキュメントに記述しています。