PHPackages                             laiz/laiz-parsec - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. laiz/laiz-parsec

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

laiz/laiz-parsec
================

Parser Combinator

v0.1.4(9y ago)135MITPHPPHP &gt;=5.6.0

Since Jul 7Pushed 9y ago3 watchersCompare

[ Source](https://github.com/nishimura/laiz-parsec)[ Packagist](https://packagist.org/packages/laiz/laiz-parsec)[ Docs](https://github.com/nishimura/laiz-parsec)[ RSS](/packages/laiz-laiz-parsec/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (3)Versions (7)Used By (0)

Laiz Parsec
===========

[](#laiz-parsec)

[![Build Status](https://camo.githubusercontent.com/e73cdb0e22ce2b406832cfaa3cebc26c7d4098f3453cff7d2d81af5b280765ce/68747470733a2f2f7472617669732d63692e6f72672f6e697368696d7572612f6c61697a2d7061727365632e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/nishimura/laiz-parsec)[![Coverage Status](https://camo.githubusercontent.com/29d6d489c2eb53fed0ed69e274e7caba47fb22967d54ff4e7b830a19fae69eec/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6e697368696d7572612f6c61697a2d7061727365632f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/nishimura/laiz-parsec?branch=master)[![Code Climate](https://camo.githubusercontent.com/190903243cf7fbd71feac10085dc29b289962e849df96f91e948a1e68c2eb109/68747470733a2f2f636f6465636c696d6174652e636f6d2f6769746875622f6e697368696d7572612f6c61697a2d7061727365632f6261646765732f6770612e737667)](https://codeclimate.com/github/nishimura/laiz-parsec)

[![Latest Stable Version](https://camo.githubusercontent.com/a19ff6fda9043fd798667ea123172a283e27a02f54e951e14f98c724d0f8e1fe/68747470733a2f2f706f7365722e707567782e6f72672f6c61697a2f6c61697a2d7061727365632f762f737461626c65)](https://packagist.org/packages/laiz/laiz-parsec)[![License](https://camo.githubusercontent.com/a8d79af67e81d78a57f0985a437d81a150ec8758c0da88467edc84801eef80c9/68747470733a2f2f706f7365722e707567782e6f72672f6c61697a2f6c61697a2d7061727365632f6c6963656e7365)](LICENSE)

String Parser
-------------

[](#string-parser)

```
require 'vendor/autoload.php';

use Laiz\Func\Either;
use Laiz\Parsec;
use function Laiz\Parsec\parse;
use function Laiz\Parsec\str;

$parser = str('abc');

$ret = parse($parser, "Test", "abcdef");
var_dump($ret);
// Right abc
```

Combinator
----------

[](#combinator)

```
require 'vendor/autoload.php';

use Laiz\Func\Either;
use Laiz\Parsec;
use function Laiz\Func\Applicative\const1;
use function Laiz\Parsec\parse;
use function Laiz\Parsec\satisfy;
use function Laiz\Parsec\flat;
use function Laiz\Parsec\many1;
use function Laiz\Parsec\endBy1;
use function Laiz\Parsec\char;
use function Laiz\Parsec\str;
use function Laiz\Parsec\eof;

$alnum = satisfy(function($s){
    return ctype_alnum($s);
});
$p = flat(many1($alnum));
$ret = parse($p, "Test", "abc,A03,zzz,@a");
var_dump($ret);
// Right "abc"

$p1 = endBy1($p, char(','));
$ret = parse($p1, "Test", "abc,A03,zzz,@a");
var_dump($ret);
// Right ["abc", "A03", "zzz"]

$p = eof();
$ret = parse($p, "Test", "abc");
var_dump($ret);
// Left ParseError

$p = eof();
$ret = parse($p, "Test", "");
var_dump($ret);
// Right Unit

$p = const1(str('abc'), eof()); // string "abc" *> eof
$ret = parse($p, "Test", "abc");
var_dump($ret);
// Right "abc"

$ret = parse($p, "Test", "abcd");
var_dump($ret);
// Left ParseError
```

HTML Parser
-----------

[](#html-parser)

```
require 'vendor/autoload.php';

use Laiz\Func\Either;
use Laiz\Parsec;
use function Laiz\Func\Applicative\pure;
use function Laiz\Parsec\parse;
use function Laiz\Parsec\tryP;
use function Laiz\Parsec\satisfy;
use function Laiz\Parsec\anyChar;
use function Laiz\Parsec\flat;
use function Laiz\Parsec\many;
use function Laiz\Parsec\many1;
use function Laiz\Parsec\char;
use function Laiz\Parsec\str;
use function Laiz\Parsec\choice;
use function Laiz\Parsec\between;
use function Laiz\Parsec\notFollowedBy;
use function Laiz\Parsec\parserReturn;
use function Laiz\Parsec\sepEndBy;
use function Laiz\Parsec\Show\show;

class Attr
{
    public $name;
    public $value;
    public function __construct($n, $v){
        $this->name = $n;
        $this->value = $v;
    }
}
class TagInfo
{
    public $name;
    public $attrs = [];
    public function __construct($n, $a = []){
        $this->name = $n;
        $this->attrs = $a;
    }
}
class Tag
{
    public $name;
    public $attrs = [];
    public $children = [];
    public function __construct($i, $c = []){
        $this->name = $i->name;
        $this->attrs = $i->attrs;
        $this->children = $c;
    }
}
class Plain
{
    public $content;
    public function __construct($c){
        $this->content = $c;
    }
}

$html = '

    User Info
    Admin

';

function not($n){
    return satisfy(function($s) use ($n){
        return $s !== $n;
    });
}
function alnum(){
    return satisfy(function($s){
        return ctype_alnum($s);
    });
}
function space(){
    return satisfy(function($s){
        return strpos(" \r\n\t", $s) !== false;
    });
}
function spaces(){ return flat(many(space())); }
function spaces1(){ return flat(many1(space())); }

// Parser s u Tag
function tag(){
    $attrName = flat(many1(alnum()));
    $eq = char('=');
    $attrValue = between(char('"'), char('"'),
                         flat(many1(not('"'))));
    $attr = $attrName->bind(function($name) use ($eq, $attrValue){
        return $eq->const2($attrValue)->bind(function($value) use ($name){
            return parserReturn(new Attr($name, $value));
        });
    });
    //var_dump(parse($attr, "Test", 'foo="bar1">'));

    $tagName = flat(many1(alnum()))->const1(spaces());
    $tagContent = $tagName->bind(function($name) use ($attr){
        return sepEndBy($attr, spaces1())->bind(function($attrs) use ($name){
            return parserReturn(new TagInfo($name, $attrs));
        });
    });
    $tagOpen = between(char(''), $tagContent);
    //var_dump(parse($tagOpen, "Test", ''));
    //var_dump(parse($tagOpen, "Test", ''));
    return $tagOpen->bind(function($info){
        return many(context())->bind(function($context) use ($info){
            $tagClose = str('');
            return $tagClose->bind(function($_) use ($info, $context){
                return parserReturn(new Tag($info, $context));
            });
        });
    });
}

// Parser s u Plain
function plain(){
    return flat(many1(not('
