public function parse(Grammar $grammar, Token $token)
{
$parameters = [];
$kind = null;
$body = null;
$has_brackets = false;
// When identifier, we have an unary function
if ($grammar->parser->is(Tag::T_IDENT)) {
$name = $grammar->identifier();
$parameters[] = (object) ['name' => $name, 'is_reference' => false];
} else {
$has_brackets = true;
$grammar->parser->match('[');
if (!$grammar->parser->consumeIf(']')) {
$parameters[] = $grammar->_parameter();
while ($grammar->parser->consumeIf(',')) {
$parameters[] = $grammar->_parameter();
}
$grammar->parser->match(']');
}
}
$grammar->parser->match('->');
if ($grammar->parser->is(Tag::T_BEGIN)) {
$kind = static::TYPE_STATEMENT;
$grammar->parser->consume();
$body = iterator_to_array($grammar->_innerStmtList());
$grammar->parser->match(Tag::T_END);
} else {
$kind = static::TYPE_EXPRESSION;
$body = $grammar->_expr();
}
return new LambdaExpr($parameters, $kind, $body, $has_brackets);
}