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, Expr $left, Token $token) { $clauses = []; $name = $grammar->identifier(); $grammar->parser->match(':-'); $value = $grammar->_expr(); $clauses[] = [$name, $value]; while ($grammar->parser->is(';')) { $grammar->parser->consume(); $name = $grammar->identifier(); $grammar->parser->match(':-'); $value = $grammar->_expr(); $clauses[] = [$name, $value]; } return new WhereExpr($left, $clauses); }
public function parse(Grammar $grammar, Token $token) { $keys = []; $values = []; if (!$grammar->parser->consumeIf('}')) { $keys[] = $grammar->identifier(); $grammar->parser->match('->'); $values[] = $grammar->_expr(); while ($grammar->parser->consumeIf(';')) { $keys[] = $grammar->identifier(); $grammar->parser->match('->'); $values[] = $grammar->_expr(); } $grammar->parser->match('}'); } return new ObjectExpr($keys, $values); }