<?php include_once dirname(__FILE__) . '/../code/PEG.php'; /** * 括弧の対応をとる再帰的なパーサのサンプル。 * 認識した括弧を用いて文字列を階層化する。 * * パーサのEBNFはこんな感じ * item := paren | anything * paren_item := (?! ")") item * paren := "(" paren_item* ")" * parser := item* */ $paren = PEG::ref($paren_ref); $item = PEG::choice($paren, PEG::anything()); $paren_item = PEG::andalso(PEG::not(')'), $item); $paren_ref = PEG::pack('(', PEG::many($paren_item), ')'); $parser = PEG::many($item); $str = 'abc(def(ghi)(jkl(mno)))pq'; var_dump($parser->parse(PEG::context($str))); /* 結果 array(6) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> array(5) { [0]=>
<?php /** * 行頭に#があったら無視するパーサのサンプル */ include_once dirname(__FILE__) . '/../code/PEG.php'; $line = PEG::line(); $ignore = PEG::drop(PEG::andalso('#', $line)); $parser = PEG::join(PEG::many(PEG::choice($ignore, $line))); $context = PEG::context(' Lorem ipsum dolor sit amet, #consectetur adipisicing elit, #sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. '); var_dump($parser->parse($context)); /* 結果 string(64) " Lorem ipsum dolor sit amet, labore et dolore magna aliqua. " */
<?php include_once dirname(__FILE__) . '/t/t.php'; $lime = new lime_test(); $parser = PEG::andalso(PEG::token('hoge'), PEG::token('h')); $lime->is($parser->parse($c = PEG::context('hoge')), 'h'); $lime->is($c->read(3), 'oge'); $result = $parser->parse(PEG::context('hogaaa')); $lime->ok($result instanceof PEG_Failure);