From aa717e6a62a6dc18d10482ea03937568c90ebb8c Mon Sep 17 00:00:00 2001 From: Itamar Date: Fri, 2 Apr 2021 11:29:44 +0300 Subject: [PATCH] LibCpp: Parse C-Style parse expressions --- Userland/Libraries/LibCpp/AST.cpp | 11 +++++++- Userland/Libraries/LibCpp/AST.h | 17 +++++++++++-- Userland/Libraries/LibCpp/Parser.cpp | 38 ++++++++++++++++++++++++++++ Userland/Libraries/LibCpp/Parser.h | 2 ++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibCpp/AST.cpp b/Userland/Libraries/LibCpp/AST.cpp index 5dbedc52cf..b3754bd7b1 100644 --- a/Userland/Libraries/LibCpp/AST.cpp +++ b/Userland/Libraries/LibCpp/AST.cpp @@ -547,8 +547,17 @@ void BracedInitList::dump(size_t indent) const { ASTNode::dump(indent); for (auto& exp : m_expressions) { - exp.dump(indent+1); + exp.dump(indent + 1); } } +void CStyleCastExpression::dump(size_t indent) const +{ + ASTNode::dump(indent); + if (m_type) + m_type->dump(indent + 1); + if (m_expression) + m_expression->dump(indent + 1); +} + } diff --git a/Userland/Libraries/LibCpp/AST.h b/Userland/Libraries/LibCpp/AST.h index 51289f0477..95cbddf167 100644 --- a/Userland/Libraries/LibCpp/AST.h +++ b/Userland/Libraries/LibCpp/AST.h @@ -386,8 +386,6 @@ public: } }; - - class BooleanLiteral : public Expression { public: virtual ~BooleanLiteral() override = default; @@ -716,6 +714,21 @@ public: RefPtr m_expression; }; +class CStyleCastExpression : public Expression { +public: + CStyleCastExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) + { + } + + virtual ~CStyleCastExpression() override = default; + virtual const char* class_name() const override { return "CStyleCastExpression"; } + virtual void dump(size_t indent) const override; + + RefPtr m_type; + RefPtr m_expression; +}; + class SizeofExpression : public Expression { public: SizeofExpression(ASTNode* parent, Optional start, Optional end, const String& filename) diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index e00aeb2528..9398169218 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -448,6 +448,9 @@ NonnullRefPtr Parser::parse_primary_expression(ASTNode& parent) if (match_cpp_cast_expression()) return parse_cpp_cast_expression(parent); + if (match_c_style_cast_expression()) + return parse_c_style_cast_expression(parent); + if (match_sizeof_expression()) return parse_sizeof_expression(parent); @@ -857,6 +860,7 @@ bool Parser::match_expression() || token_type == Token::Type::Identifier || match_unary_expression() || match_cpp_cast_expression() + || match_c_style_cast_expression() || match_sizeof_expression() || match_braced_init_list(); } @@ -1394,6 +1398,40 @@ bool Parser::match_cpp_cast_expression() return false; } +bool Parser::match_c_style_cast_expression() +{ + save_state(); + ScopeGuard state_guard = [this] { load_state(); }; + + if (consume().type() != Token::Type::LeftParen) + return false; + + if (match_type() == TemplatizedMatchResult::NoMatch) + return false; + parse_type(*m_root_node); + + if (consume().type() != Token::Type::RightParen) + return false; + + if (!match_expression()) + return false; + + return true; +} + +NonnullRefPtr Parser::parse_c_style_cast_expression(ASTNode& parent) +{ + auto parse_exp = create_ast_node(parent, position(), {}); + + consume(Token::Type::LeftParen); + parse_exp->m_type = parse_type(*parse_exp); + consume(Token::Type::RightParen); + parse_exp->m_expression = parse_expression(*parse_exp); + parse_exp->set_end(position()); + + return parse_exp; +} + NonnullRefPtr Parser::parse_cpp_cast_expression(ASTNode& parent) { auto cast_expression = create_ast_node(parent, position(), {}); diff --git a/Userland/Libraries/LibCpp/Parser.h b/Userland/Libraries/LibCpp/Parser.h index e57ecdd493..0fff5f685d 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_c_style_cast_expression(); bool match_sizeof_expression(); bool match_braced_init_list(); @@ -137,6 +138,7 @@ private: NonnullRefPtr parse_cpp_cast_expression(ASTNode& parent); NonnullRefPtr parse_sizeof_expression(ASTNode& parent); NonnullRefPtr parse_braced_init_list(ASTNode& parent); + NonnullRefPtr parse_c_style_cast_expression(ASTNode& parent); bool match(Token::Type); Token consume(Token::Type);