protected function createImageLink() { $ext = PEG::choice('.jpg', '.png', '.gif'); $src_char = PEG::pack('[', PEG::seq(PEG::many1(PEG::subtract($this->lineChar, ']', $ext)), $ext), ']'); $src = PEG::join($src_char); $alt_char = PEG::pack('[', PEG::many1(PEG::subtract($this->lineChar, ']')), ']'); $alt = PEG::join($alt_char); $parser = PEG::seq($src, PEG::optional($alt)); return $this->nodeCreater(OrgModeSyntax_Node::TYPE_IMAGELINK, $parser, array('src', 'alt')); }
<?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. " */
protected function createNullLink() { $body = PEG::join(PEG::many1(PEG::subtract($this->lineChar, '[]'))); $parser = PEG::pack(']', $body, '['); return $parser; }
<?php include_once dirname(__FILE__) . '/t/t.php'; $lime = new lime_test(); $join = PEG::join(PEG::seq('b', PEG::many('a'))); $context = PEG::context('baaa'); $lime->is($join->parse($context), 'baaa');
<?php include_once dirname(__FILE__) . '/../code/PEG.php'; /* * 単語にヒットするパーサ。 * * EBNF: * word := (PEG::alphabet | "_") (PEG::alphabet | PEG::digit | "_")+ */ $word = PEG::join(PEG::seq(PEG::choice(PEG::alphabet(), PEG::token('_')), PEG::many(PEG::choice(PEG::alphabet(), PEG::digit(), PEG::token('_'))))); var_dump($word->parse(PEG::context('a'))); //=> 'a' var_dump($word->parse(PEG::context('hogehoge'))); //=> 'hogehoge' var_dump($word->parse(PEG::context('some_id'))); //=> 'some_id' var_dump($word->parse(PEG::context(' '))); //=> パースに失敗する var_dump($word->parse(PEG::context('hoge fuga'))); //=> パースはコンテキストの途中で止まり 'hoge'が返る