diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index 0b7c5c4483..419ad2bdbc 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -656,6 +656,7 @@ bool Parser::match_class_declaration() if (!match_keyword("struct") && !match_keyword("class")) return false; + consume(Token::Type::Keyword); if (!match(Token::Type::Identifier)) @@ -1439,6 +1440,8 @@ NonnullRefPtrVector Parser::parse_class_members(ASTNode& parent) { NonnullRefPtrVector members; while (!eof() && peek().type() != Token::Type::RightCurly) { + if (match_access_specifier()) + consume_access_specifier(); // FIXME: Do not ignore access specifiers auto member_type = match_class_member(); if (member_type.has_value()) { members.append(parse_declaration(parent, member_type.value())); @@ -1450,4 +1453,18 @@ NonnullRefPtrVector Parser::parse_class_members(ASTNode& parent) return members; } +bool Parser::match_access_specifier() +{ + if (peek(1).type() != Token::Type::Colon) + return false; + + return match_keyword("private") || match_keyword("protected") || match_keyword("public"); +} + +void Parser::consume_access_specifier() +{ + consume(Token::Type::Keyword); + consume(Token::Type::Colon); +} + } diff --git a/Userland/Libraries/LibCpp/Parser.h b/Userland/Libraries/LibCpp/Parser.h index a99d965452..509e9d336b 100644 --- a/Userland/Libraries/LibCpp/Parser.h +++ b/Userland/Libraries/LibCpp/Parser.h @@ -75,6 +75,7 @@ private: bool match_sizeof_expression(); bool match_braced_init_list(); bool match_type(); + bool match_access_specifier(); Optional> parse_parameter_list(ASTNode& parent); Optional consume_whitespace(); @@ -162,6 +163,7 @@ private: bool match_attribute_specification(); void consume_attribute_specification(); + void consume_access_specifier(); bool match_ellipsis(); void initialize_program_tokens(const StringView& program); void add_tokens_for_preprocessor(Token& replaced_token, Preprocessor::DefinedValue&);