From fc503b13688dd7d6078caa7692640302e861df61 Mon Sep 17 00:00:00 2001 From: Itamar Date: Fri, 2 Apr 2021 10:49:12 +0300 Subject: [PATCH] LibCpp: Parse sizeof() expression --- Userland/Libraries/LibCpp/AST.cpp | 7 +++++++ Userland/Libraries/LibCpp/AST.h | 14 ++++++++++++++ Userland/Libraries/LibCpp/Parser.cpp | 22 +++++++++++++++++++++- Userland/Libraries/LibCpp/Parser.h | 2 ++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibCpp/AST.cpp b/Userland/Libraries/LibCpp/AST.cpp index f5088dbf5d..5ae64b30a4 100644 --- a/Userland/Libraries/LibCpp/AST.cpp +++ b/Userland/Libraries/LibCpp/AST.cpp @@ -530,4 +530,11 @@ void CppCastExpression::dump(size_t indent) const m_expression->dump(indent + 1); } +void SizeofExpression::dump(size_t indent) const +{ + ASTNode::dump(indent); + if(m_type) + m_type->dump(indent+1); +} + } diff --git a/Userland/Libraries/LibCpp/AST.h b/Userland/Libraries/LibCpp/AST.h index 04c1247340..257ff23938 100644 --- a/Userland/Libraries/LibCpp/AST.h +++ b/Userland/Libraries/LibCpp/AST.h @@ -715,4 +715,18 @@ public: RefPtr m_expression; }; +class SizeofExpression : public Expression { +public: + SizeofExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) + { + } + + virtual ~SizeofExpression() override = default; + virtual const char* class_name() const override { return "SizeofExpression"; } + virtual void dump(size_t indent) const override; + + RefPtr m_type; +}; + } diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index baef20b692..6c77bcf956 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -447,6 +447,9 @@ NonnullRefPtr Parser::parse_primary_expression(ASTNode& parent) if (match_cpp_cast_expression()) return parse_cpp_cast_expression(parent); + if(match_sizeof_expression()) + return parse_sizeof_expression(parent); + if (match_name()) { if (match_function_call() != TemplatizedMatchResult::NoMatch) return parse_function_call(parent); @@ -847,7 +850,8 @@ bool Parser::match_expression() return match_literal() || token_type == Token::Type::Identifier || match_unary_expression() - || match_cpp_cast_expression(); + || match_cpp_cast_expression() + || match_sizeof_expression(); } bool Parser::eof() const @@ -1399,4 +1403,20 @@ NonnullRefPtr Parser::parse_cpp_cast_expression(ASTNode& pare return cast_expression; } +bool Parser::match_sizeof_expression() +{ + return match_keyword("sizeof"); +} + +NonnullRefPtr Parser::parse_sizeof_expression(ASTNode& parent) +{ + auto exp = create_ast_node(parent, position(), {}); + consume(Token::Type::Keyword); + consume(Token::Type::LeftParen); + exp->m_type = parse_type(parent); + consume(Token::Type::RightParen); + exp->set_end(position()); + return exp; +} + } diff --git a/Userland/Libraries/LibCpp/Parser.h b/Userland/Libraries/LibCpp/Parser.h index de6a614028..0c308a90ff 100644 --- a/Userland/Libraries/LibCpp/Parser.h +++ b/Userland/Libraries/LibCpp/Parser.h @@ -90,6 +90,7 @@ private: bool match_template_arguments(); bool match_name(); bool match_cpp_cast_expression(); + bool match_sizeof_expression(); enum class TemplatizedMatchResult { NoMatch, @@ -133,6 +134,7 @@ private: NonnullRefPtrVector parse_template_arguments(ASTNode& parent); NonnullRefPtr parse_name(ASTNode& parent); NonnullRefPtr parse_cpp_cast_expression(ASTNode& parent); + NonnullRefPtr parse_sizeof_expression(ASTNode& parent); bool match(Token::Type); Token consume(Token::Type);