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); }
public function parse(Grammar $grammar, Token $token) { $body = new StmtList(iterator_to_array($grammar->_innerStmtList())); $grammar->parser->match('}'); return new BlockExpr($body); }