PEGクラスメソッド
http://svn.openpear.org/PEG/trunk/code/PEG.php
PEGクラスメソッドは主にパーサを生成したりコンテキストを生成するのに利用される。
-
PEGクラスメソッド
- パーサを取るメソッドにパーサ以外の値を渡した場合
- PEG::seq($parser) - 連接
- PEG::choice($parser) - 順序付き選択
- PEG::many($parser) - 繰り返し
- PEG::optional($parser) - 省略可能
- PEG::many1($parser) - 一回以上の繰り返し
- PEG::anything() - どんな要素にもマッチする
- PEG::not($parser) - 否定先読み
- PEG::amp($parser) - 先読み
- PEG::subtract($parser, $a...)
- PEG::char($str, $except = false) - 文字にマッチする
- PEG::hook($callback, $parser)
- PEG::first($parser)
- PEG::second($parser)
- PEG::third($parser)
- PEG::tail($parser)
- PEG::drop($parser)
- PEG::parserOf($callback)
- PEG::ref(&$ref)
- PEG::delay($callback)
- PEG::error($msg) - エラーをコンテキストに記録するパーサ
- PEG::token($token)
- PEG::pack($open, $parser, $close)
- PEG::flatten($parser)
- PEG::join($parser, $glue = '')
- PEG::memo($parser) - パーサをメモ化
- PEG::alphabet()
- PEG::lower()
- PEG::upper()
- PEG::digit()
- PEG::failure() - 失敗を返す
- PEG::newLine() - 改行にヒットするパーサ
- PEG::listOf($item, $glue) - リストのような形式にヒットするパーサ
パーサを取るメソッドにパーサ以外の値を渡した場合
引数にパーサを取るメソッドにパーサ以外の値を渡した場合、PEG::token(値)であるとみなされる。
つまり、PEG::seq('a', 'b') は PEG::seq(PEG::token('a'), PEG::token('b')) と同じ意味のパーサを返す。
PEG::seq($parser) - 連接
PEGにおける連接を表現するパーサを返す。引数の数は任意である。
PEG::seq($a, $b) とした場合、このパーサは、$aパーサを実行した後に$bパーサを実行し、これらのパーサの結果を配列で返す。
引数に与えたパーサの結果としてnullが帰ってきた場合、無視される。パーサの返り値をnullにしたい場合はPEG::drop()を利用する。
<?php
PEG::seq('a', 'b', 'c')->parse(PEG::context('abc')); // => array('a', 'b', 'c')
PEG::seq('a', 'b', 'c')->parse(PEG::context('def')); // => 失敗
PEG::seq('a', 'b', 'c')->parse(PEG::context('abd')); // => 失敗
PEG::seq('a', PEG::drop('b'), 'c')->parse(PEG::context('abc')); // => array('a', 'c')
PEG::choice($parser) - 順序付き選択
PEGにおける順序付き選択を表現するパーサを返す。引数の数は任意である。
PEG::choice($a, $b) とした場合、このパーサは、まず$aパーサを実行し、失敗が帰ってきた場合は$aパーサを実行する前の状態にバックトラックして$bパーサを実行する。引数に与えられた全てのパーサに失敗した場合は、このパーサも失敗を返す。
<?php
PEG::choice('a', 'b')->parse(PEG::context('a')); // => 'a'
PEG::choice('a', 'b')->parse(PEG::context('b')); // => 'b'
PEG::choice('a', 'b')->parse(PEG::context('c')); // => 失敗
PEG::many($parser) - 繰り返し
PEGにおける繰り返しを表現するパーサを返す。
PEG::many($a) とした場合、このパーサは$aパーサを失敗するまで繰り返す実行し、返り値として$aパーサが返した結果の配列を返す。
PEG::seq()と同様に、引数に与えたパーサの結果としてnullが帰ってきた場合、無視される。
引数を二つ以上与えた場合、PEG::many($a, $b, $c) は PEG::many(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
<?php
PEG::many('a')->parse(PEG::context('aaa')); // => array('a', 'a', 'a')
PEG::many('a')->parse(PEG::context('aaabbb')); // => array('a', 'a', 'a')
PEG::many('a')->parse(PEG::context('bbb')); // => array()
PEG::many(PEG::drop('a'), 'b')->parse(PEG::context('ababab')); // => array(array('b'), array('b'), array('b'))
PEG::optional($parser) - 省略可能
PEGにおける省略可能を表現するパーサを返す。
引数を二つ以上与えた場合、PEG::optional($a, $b, $c) は PEG::optional(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
<?php
PEG::optional('a')->parse(PEG::context('a')); // => 'a'
PEG::optional('a')->parse(PEG::context('b')); // => false
PEG::many1($parser) - 一回以上の繰り返し
PEGにおける一回以上の繰り返しを表現するパーサを返す。
引数を二つ以上与えた場合、PEG::many1($a, $b, $c) は PEG::many1(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
<?php
PEG::many1('ab')->parse(PEG::context('ababab')); // => array('ab', 'ab', 'ab')
PEG::many1('ab')->parse(PEG::context('babab')); // => 失敗
PEG::anything() - どんな要素にもマッチする
どんな要素にもマッチするパーサを返す。
<?php
PEG::anything()->parse(PEG::context('a')); // => 'a'
PEG::many(PEG::anything())->parse(PEG::context('abcdefg')); // => array('a', 'b', 'c', 'd', 'e', 'f', 'g')
PEG::not($parser) - 否定先読み
PEGにおける否定先読みを表現するパーサを返す。
このパーサは、$parserを実行して成功した場合は失敗を返し、そうではない場合はfalseを返す。また、コンテキストは$parserを実行する前に状態に戻される。
引数を二つ以上与えた場合、PEG::not($a, $b, $c) は PEG::not(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
<?php
PEG::seq(PEG::drop(PEG::not('a')), PEG::anything())->parse(PEG::context('b')); // => 'b'
PEG::seq(PEG::drop(PEG::not('a')), PEG::anything())->parse(PEG::context('c')); // => 'c'
PEG::seq(PEG::drop(PEG::not('a')), PEG::anything())->parse(PEG::context('a')); // => 失敗
PEG::amp($parser) - 先読み
PEGにおける先読みを表現するパーサを返す。
このパーサは、$parserを実行してその結果をそのまま返す。また、コンテキストは$parserを実行する前の状態に戻される。
引数を二つ以上与えた場合、PEG::amp($a, $b, $c) は PEG::amp(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
PEG::subtract($parser, $a...)
PEG::subtract($parser, $a, $b, $c) は PEG::tail(PEG::not($a), PEG::not($b), PEG::not($c), $parser) と同じ意味のパーサを返す。
PEG::char($str, $except = false) - 文字にマッチする
PEG::char('abcd') は 'a', 'b', 'c', 'd' にマッチする。
PEG::char('abcd', true) は 'a', 'b', 'c', 'd' 以外の文字にマッチする。
PEG::hook($callback, $parser)
引数に与えられたパーサの結果を$callbackで加工するパーサを返す。
$parserが失敗した場合は$callbackは呼ばれない。
引数を二つ以上与えた場合、PEG::hook($a, $b, $c) は PEG::hook($a, PEG::seq($b, $c)) と同じ意味を持ったパーサを返す。
PEG::first($parser)
引数に与えられたパーサの結果の最初の要素を返すパーサを返す。
引数を二つ以上与えた場合、PEG::first($a, $b, $c) は PEG::first(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
<?php
PEG::seq('a', 'b', 'c')->parse(PEG::context('abc')); // => array('a', 'b', 'c')
PEG::first('a', 'b', 'c')->parse(PEG::context('abc')); // => 'a'
PEG::second($parser)
引数に与えられたパーサの結果の二番目の要素を返すパーサを返す。
引数を二つ以上与えた場合、PEG::second($a, $b, $c) は PEG::second(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
PEG::third($parser)
引数に与えられたパーサの結果の三番目の要素を返すパーサを返す。
引数を二つ以上与えた場合、PEG::third($a, $b, $c) は PEG::third(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
PEG::tail($parser)
$parserが返す配列の最後の値を返すパーサを返す。
PEG::drop($parser)
引数に与えられたパーサを実行し、結果としてnullを返すパーサを返す。
PEG::seq()やPEG::many(), PEG::many1()とともに利用することを想定している。
引数を二つ以上与えた場合、PEG::drop($a, $b, $c) は PEG::drop(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
PEG::parserOf($callback)
$callbackを元にパーサを構築する。$callbackはPEG_IParser::parse(PEG_IContext)メソッドの代わりとして用いられる。
PEG::ref(&$ref)
実行時に$refパーサを呼び出すパーサを返す。
再帰を含む文法のパーサを組み立てる際に利用される。
<?php
$parser = PEG::choice(PEG::seq('a', PEG::ref($parser)), 'a');
$parser->parse(PEG::context('aaaa')); // => array('a', array('a', array('a', 'a')))
PEG::delay($callback)
最初の実行時に$callbackを呼び出し、その返り値のパーサを実行するパーサを返す。
再帰を含む文法のパーサを組み立てる際に利用される。
PEG::error($msg) - エラーをコンテキストに記録するパーサ
実行時にコンテキストにエラーメッセージを登録し、失敗するパーサを返す。
PEG::token($token)
PEG_IContext::token(Array $args)メソッドに動きを委譲するパーサを返す。
PEG::pack($open, $parser, $close)
実行時に$open, $parser, $closeパーサを順番に実行し、$parserが返した値を返すパーサを返す。
PEG::second()とほとんど同じ。
PEG::flatten($parser)
$parserが返す配列を平にして返すパーサを返す。
引数を二つ以上与えた場合、PEG::flatten($a, $b, $c) は PEG::flatten(PEG::seq($a, $b, $c)) と同じ意味を持ったパーサを返す。
<?php
PEG::seq('a', PEG::seq('b', 'c'))->parse(PEG::context('abc')); // => array('a', array('b', 'c'))
PEG::flatten('a', PEG:seq('b', 'c'))->parse(PEG::context('abc')); // => array('a', 'b', 'c')
PEG::join($parser, $glue = '')
$parserが返す配列を平にした後ひとつの文字列に連結して返すパーサを返す。
PEG::memo($parser) - パーサをメモ化
$parserをpackrat parser化する。コンテキストとその位置に紐解かれた結果がキャッシュされるようになる。
PEG::alphabet()
アルファベットにヒットするパーサを返す。
PEG::lower()
アルファベットの小文字にヒットするパーサを返す。
PEG::upper()
アルファベットの大文字にヒットするパーサを返す。
PEG::digit()
0から9までの数字にヒットするパーサを返す。
PEG::failure() - 失敗を返す
失敗を返す。
PEG::newLine() - 改行にヒットするパーサ
改行にヒットするパーサを返す。
PEG::listOf($item, $glue) - リストのような形式にヒットするパーサ
PEG::seq($item, $glue, $item, $glue, ... , $glue, $item) という形式にヒットするパーサを返す。
パーサの結果としては、$itemの結果の配列を返す。
<?php
PEG::listOf(PEG::alphabet(), ',')->parse(PEG::context('a,b,c'); // => array('a', 'b', 'c')
PEG::listOf(PEG::alphabet(), ',')->parse(PEG::context('a'); // => array('a')
PEG::listOf(PEG::alphabet(), ',')->parse(PEG::context(','); // => 失敗