From d13f9bf9f838d5876399b1b2556b97abbcedd60d Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Tue, 8 Jul 2025 09:51:15 +0200 Subject: [PATCH] added the parsing of expression statements --- src/ast/statements/expression.cpp | 16 ++++++++++++++++ src/ast/statements/expression.hpp | 15 +++++++++++++++ src/parser/parser.cpp | 22 ++++++++++++++-------- src/parser/parser.hpp | 2 ++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 src/ast/statements/expression.cpp create mode 100644 src/ast/statements/expression.hpp diff --git a/src/ast/statements/expression.cpp b/src/ast/statements/expression.cpp new file mode 100644 index 0000000..0927058 --- /dev/null +++ b/src/ast/statements/expression.cpp @@ -0,0 +1,16 @@ +#include "expression.hpp" + +namespace ast { + + expression_stmt::expression_stmt(token::token token) + : token(std::move(token)), + expression(nullptr) {} + + std::string expression_stmt::token_literal() const { + return token.literal; + } + + expression_stmt::~expression_stmt() { + delete expression; + } +} // namespace ast diff --git a/src/ast/statements/expression.hpp b/src/ast/statements/expression.hpp new file mode 100644 index 0000000..653c26c --- /dev/null +++ b/src/ast/statements/expression.hpp @@ -0,0 +1,15 @@ +#include "ast/ast.hpp" +#include "token/token.hpp" + +namespace ast { + struct expression_stmt : statement { + expression_stmt(token::token token); + + token::token token; + ast::expression* expression; + + std::string token_literal() const override; + + ~expression_stmt(); + }; +} // namespace ast diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index c2fe8d7..f8f726c 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -42,14 +42,6 @@ namespace parser { } } - bool parser::expect_next(token::type t) { - if (next.type == t) { - next_token(); - return true; - } - next_error(t); - return false; - } ast::expression* parser::parse_expression() { // TODO: we are currently skipping expressions until we encounter a // semicolon @@ -85,7 +77,21 @@ namespace parser { return stmt; } + ast::expression_stmt* parser::parse_expression_stmt() { + ast::expression_stmt* stmt = new ast::expression_stmt(current); + + stmt->expression = parse_expression(); + return stmt; + }; + + bool parser::expect_next(token::type t) { + if (next.type == t) { + next_token(); + return true; + } + next_error(t); + return false; } void parser::next_error(token::type t) { diff --git a/src/parser/parser.hpp b/src/parser/parser.hpp index a19c539..5635084 100644 --- a/src/parser/parser.hpp +++ b/src/parser/parser.hpp @@ -2,6 +2,7 @@ #include "ast/ast.hpp" #include "ast/errors/error.hpp" +#include "ast/statements/expression.hpp" #include "ast/statements/let.hpp" #include "ast/statements/return.hpp" #include "lexer/lexer.hpp" @@ -24,6 +25,7 @@ namespace parser { ast::expression* parse_expression(); ast::let_stmt* parse_let(); ast::return_stmt* parse_return(); + ast::expression_stmt* parse_expression_stmt(); bool expect_next(token::type); void next_error(token::type); };