読者です 読者をやめる 読者になる 読者になる

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風の文法のパーサを作るチュートリアルなどが用意されています。

詳しいことは

ドキュメントに記述しています。