in src/Parser.php [1201:1297]
private function parsePrimaryExpression($parentNode) {
$token = $this->getCurrentToken();
switch ($token->kind) {
// variable-name
case TokenKind::VariableName: // TODO special case $this
case TokenKind::DollarToken:
return $this->parseSimpleVariable($parentNode);
// qualified-name
case TokenKind::Name: // TODO Qualified name
case TokenKind::BackslashToken:
case TokenKind::NamespaceKeyword:
return $this->parseQualifiedName($parentNode);
case TokenKind::DecimalLiteralToken: // TODO merge dec, oct, hex, bin, float -> NumericLiteral
case TokenKind::OctalLiteralToken:
case TokenKind::HexadecimalLiteralToken:
case TokenKind::BinaryLiteralToken:
case TokenKind::FloatingLiteralToken:
case TokenKind::InvalidOctalLiteralToken:
case TokenKind::InvalidHexadecimalLiteral:
case TokenKind::InvalidBinaryLiteral:
case TokenKind::IntegerLiteralToken:
return $this->parseNumericLiteralExpression($parentNode);
case TokenKind::StringLiteralToken:
return $this->parseStringLiteralExpression($parentNode);
case TokenKind::DoubleQuoteToken:
case TokenKind::SingleQuoteToken:
case TokenKind::HeredocStart:
case TokenKind::BacktickToken:
return $this->parseStringLiteralExpression2($parentNode);
// TODO constant-expression
// array-creation-expression
case TokenKind::ArrayKeyword:
case TokenKind::OpenBracketToken:
return $this->parseArrayCreationExpression($parentNode);
// intrinsic-construct
case TokenKind::ListKeyword:
return $this->parseListIntrinsicExpression($parentNode);
// intrinsic-operator
case TokenKind::EmptyKeyword:
return $this->parseEmptyIntrinsicExpression($parentNode);
case TokenKind::EvalKeyword:
return $this->parseEvalIntrinsicExpression($parentNode);
case TokenKind::ExitKeyword:
case TokenKind::DieKeyword:
return $this->parseExitIntrinsicExpression($parentNode);
case TokenKind::IsSetKeyword:
return $this->parseIssetIntrinsicExpression($parentNode);
case TokenKind::PrintKeyword:
return $this->parsePrintIntrinsicExpression($parentNode);
// ( expression )
case TokenKind::OpenParenToken:
return $this->parseParenthesizedExpression($parentNode);
// anonymous-function-creation-expression
case TokenKind::AttributeToken:
return $this->parseAttributeExpression($parentNode);
case TokenKind::StaticKeyword:
// handle `static::`, `static(`, `new static;`, `instanceof static`
if (!$this->lookahead([TokenKind::FunctionKeyword, TokenKind::FnKeyword])) {
// TODO: Should this check the parent type to reject `$x = static;`, `$x = static();`, etc.
return $this->parseStaticQualifiedName($parentNode);
}
// Could be `static function` anonymous function creation expression, so flow through
case TokenKind::FunctionKeyword:
case TokenKind::FnKeyword:
return $this->parseAnonymousFunctionCreationExpression($parentNode);
case TokenKind::TrueReservedWord:
case TokenKind::FalseReservedWord:
case TokenKind::NullReservedWord:
// handle `true::`, `true(`, `true\`
if ($this->lookahead([TokenKind::BackslashToken, TokenKind::ColonColonToken, TokenKind::OpenParenToken])) {
return $this->parseQualifiedName($parentNode);
}
return $this->parseReservedWordExpression($parentNode);
case TokenKind::MatchKeyword:
return $this->parseMatchExpression($parentNode);
}
if (\in_array($token->kind, TokenStringMaps::RESERVED_WORDS)) {
return $this->parseQualifiedName($parentNode);
}
return new MissingToken(TokenKind::Expression, $token->fullStart);
}