Skip to content

Commit

Permalink
Merge branch 'tune'
Browse files Browse the repository at this point in the history
  • Loading branch information
nishimura committed Jul 9, 2016
2 parents 324ee3a + baea75d commit b451796
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 25 deletions.
16 changes: 16 additions & 0 deletions src/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,20 @@ public function unParser()
{
return $this->f;
}

/**
* Override Applicative
*/
public function const1($b)
{
return const1($this, $b);
}

/**
* Override Applicative
*/
public function const2($b)
{
return const2($this, $b);
}
}
5 changes: 4 additions & 1 deletion src/char.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,8 @@ function inFix(...$args){
* string :: (Stream s Char) => String -> Parser s u String
*/
function str($s){
return tokens(show(), updatePosString(), $s);
return tokens(
function($a){ return show($a); },
function($pos, $str){ return updatePosString($pos, $str); },
$s);
}
56 changes: 47 additions & 9 deletions src/combinator.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@

use Laiz\Func;
use function Laiz\Func\f;
use function Laiz\Func\foldr;
use function Laiz\Func\colonr;
use function Laiz\Func\Functor\fmap;
use function Laiz\Func\Monad\bind;
use function Laiz\Func\Alternative\aor;
use function Laiz\parsec\Show\show;

Expand Down Expand Up @@ -49,7 +45,10 @@ function manyAccum($acc, Parser $p)
function many(...$args)
{
$f = function(Parser $p){
return manyAccum(colonr(), $p);
return manyAccum(function($a, $as){
$as[] = $a;
return $as;
}, $p);
};
if (count($args) === 1)
return $f(...$args);
Expand Down Expand Up @@ -147,7 +146,12 @@ function optional(...$args)
function choice(...$args)
{
$f = function($ps){
return foldr(aor(), parserZero(), $ps);
// foldr
$ret = parserZero();
for ($i = count($ps) - 1; $i >= 0; $i--){
$ret = aor($ps[$i], $ret);
}
return $ret;
};
if (count($args) === 1)
return $f(...$args);
Expand Down Expand Up @@ -287,9 +291,10 @@ function endBy(...$args)
*/
function anyToken()
{
return tokenPrim(show(), function($pos, $_tok, $_toks){
return $pos;
}, Func\Maybe\Just());
return tokenPrim(
function($a){ return show($a); },
function($pos, $_tok, $_toks){ return $pos; },
function($a){ return new Func\Maybe\Just($a); });
}

/**
Expand Down Expand Up @@ -341,3 +346,36 @@ function manyTill(...$args)
else
return f($f, ...$args);
}

//============================================================
// Utility
//============================================================
// override Applicative
function const1(...$args)
{
$f = function(Parser $a, Parser $b){
return $a->bind(function($x) use ($b){
return $b->bind(function($_) use ($x){
return parserReturn($x);
});
});
};
if (count($args) === 2)
return $f(...$args);
else
return f($f, ...$args);
}
function const2(...$args)
{
$f = function(Parser $a, Parser $b){
return $a->bind(function($_) use ($b){
return $b->bind(function($x) {
return parserReturn($x);
});
});
};
if (count($args) === 2)
return $f(...$args);
else
return f($f, ...$args);
}
14 changes: 7 additions & 7 deletions src/fast.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

use Laiz\Func\Maybe;
use Laiz\Func\Any;
use function Laiz\Func\f;
use function Laiz\Func\foldr;
use function Laiz\Func\Maybe\fromJust;
use function Laiz\Parsec\Stream\uncons;

Expand Down Expand Up @@ -213,11 +211,11 @@ function _runParser(Parser $p, State $state)
new Message(Expect, $showTokens($tts)),
newErrorMessage(new Message(SysUnExpect, ''), $s->pos()));
};
$errExpect = f(function($x) use ($showTokens, $tts, $s){
$errExpect = function($x) use ($showTokens, $tts, $s){
return setErrorMessage(
new Message(Expect, $showTokens($tts)),
newErrorMessage(new Message(SysUnExpect, $showTokens([$x])), $s->pos()));
});
};

$r = uncons($s->input());
if ($r instanceof Maybe\Nothing){
Expand Down Expand Up @@ -402,8 +400,10 @@ function setExpectErrors(ParseError $err, $msgs){
$msg = array_shift($msgs);
$ret = setErrorMessage(new Message(Expect, $msg), $err);

return foldr(function($e, $m){
return addErrorMessage(new Message(Expect, $m), $e);
}, $ret, $msgs);
// foldr
for ($i = count($msgs) - 1; $i >= 0; $i--){
$ret = addErrorMessage(new Message(Expect, $msgs[$i]), $ret);
}
return $ret;
}

10 changes: 4 additions & 6 deletions src/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@
use Laiz\Func\Any;
use Laiz\Func\Maybe;
use function Laiz\Func\f;
use function Laiz\Func\filter;
use function Laiz\Func\foldr;
use function Laiz\Func\cnst;
use function Laiz\Func\Functor\fmap;
use function Laiz\Func\Monad\bind;
use function Laiz\Func\Monoid\mappend;
use function Laiz\Parsec\Stream\uncons;
use function Laiz\Func\Either\Right;
use function Laiz\Func\Either\Left;
use Laiz\Func\Either\Right;
use Laiz\Func\Either\Left;

const SysUnExpect = 0;
const UnExpect = 1;
Expand Down Expand Up @@ -248,9 +246,9 @@ function runPT($p, $u, $name, $s){
$res = runParser($p, new State($s, initialPos($name), $u));
$r = $res->data();
if ($r instanceof Reply\Ok)
return Right($r->data());
return new Right($r->data());
else
return Left($r->err());
return new Left($r->err());
}

/**
Expand Down
4 changes: 2 additions & 2 deletions test/ParserCombinatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -404,11 +404,11 @@ public function testEof()
$ret = parse($parser, "Test", "");
$this->assertEquals(Right(new Func\Unit()), $ret);

$p2 = Func\Applicative\const1(str('abc'), eof());
$p2 = Parsec\const1(str('abc'), eof());
$ret = parse($p2, "Test", "abc");
$this->assertEquals(Right('abc'), $ret);

$p2 = Func\Applicative\const1(str('abc'), eof());
$p2 = Parsec\const1(str('abc'), eof());
$ret = parse($p2, "Test", "abcd");
$err = null;
$ret->either(function($a) use (&$err){
Expand Down

0 comments on commit b451796

Please sign in to comment.