diff --git a/Userland/Libraries/LibCpp/AST.cpp b/Userland/Libraries/LibCpp/AST.cpp index 4cef2dd177..f44499be1a 100644 --- a/Userland/Libraries/LibCpp/AST.cpp +++ b/Userland/Libraries/LibCpp/AST.cpp @@ -437,4 +437,9 @@ void NamespaceDeclaration::dump(size_t indent) const decl.dump(indent + 1); } +void NullPointerLiteral::dump(size_t indent) const +{ + ASTNode::dump(indent); +} + } diff --git a/Userland/Libraries/LibCpp/AST.h b/Userland/Libraries/LibCpp/AST.h index 0941b3b993..f1fea9d47e 100644 --- a/Userland/Libraries/LibCpp/AST.h +++ b/Userland/Libraries/LibCpp/AST.h @@ -341,6 +341,20 @@ public: StringView m_value; }; +class NullPointerLiteral : public Expression { +public: + virtual ~NullPointerLiteral() override = default; + virtual const char* class_name() const override { return "NullPointerLiteral"; } + virtual void dump(size_t indent) const override; + + NullPointerLiteral(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) + { + } +}; + + + class BooleanLiteral : public Expression { public: virtual ~BooleanLiteral() override = default; diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index b8838335f5..14db37a755 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -414,8 +414,10 @@ bool Parser::match_literal() return true; case Token::Type::DoubleQuotedString: return true; + case Token::Type::Float: + return true; case Token::Type::Keyword: { - return match_boolean_literal(); + return match_boolean_literal() || peek().text() == "nullptr"; } default: return false; @@ -477,6 +479,10 @@ NonnullRefPtr Parser::parse_literal(ASTNode& parent) case Token::Type::Keyword: { if (match_boolean_literal()) return parse_boolean_literal(parent); + if (peek().text() == "nullptr") { + auto token = consume(); + return create_ast_node(parent, token.start(), token.end()); + } [[fallthrough]]; } default: { @@ -771,10 +777,8 @@ void Parser::error(StringView message) bool Parser::match_expression() { auto token_type = peek().type(); - return token_type == Token::Type::Integer - || token_type == Token::Type::Float + return match_literal() || token_type == Token::Type::Identifier - || token_type == Token::Type::DoubleQuotedString || match_unary_expression(); }