From 2174781b77cec04c18dfb62157a9c870bdaeb68f Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Fri, 11 Jul 2025 11:16:16 +0200 Subject: [PATCH] using smart pointers instead of normal ones for easier setup of tests (to call setup() multiple times without leaks) --- src/lexer/lexer.cpp | 2 ++ src/lexer/lexer.hpp | 1 + src/parser/parser.cpp | 4 ++-- src/parser/parser.hpp | 3 ++- test/parser/let.cpp | 4 ++-- test/parser/utils.cpp | 10 ++-------- test/parser/utils.hpp | 8 +++----- 7 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/lexer/lexer.cpp b/src/lexer/lexer.cpp index 0e5c5e3..a6f9e84 100644 --- a/src/lexer/lexer.cpp +++ b/src/lexer/lexer.cpp @@ -7,6 +7,8 @@ #include namespace lexer { + lexer::lexer(std::istream& input): input(input) {} + token::token lexer::next_token() { if (!(input >> c)) return {token::type::END_OF_FILE, ""}; diff --git a/src/lexer/lexer.hpp b/src/lexer/lexer.hpp index 259f80d..302de76 100644 --- a/src/lexer/lexer.hpp +++ b/src/lexer/lexer.hpp @@ -6,6 +6,7 @@ namespace lexer { struct lexer { + lexer(std::istream&); std::istream& input; char c = 0; token::token next_token(); diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index 3bc98a6..aea0601 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -84,8 +84,8 @@ namespace parser { next_token()) {}; } - ast::program* parser::parse_program() { - ast::program* p = new ast::program(); + std::unique_ptr parser::parse_program() { + std::unique_ptr p = std::make_unique(); for (; current.type != token::type::END_OF_FILE; next_token()) { ast::statement* stmt = parse_statement(); diff --git a/src/parser/parser.hpp b/src/parser/parser.hpp index 4fc5a6b..33d2a99 100644 --- a/src/parser/parser.hpp +++ b/src/parser/parser.hpp @@ -11,6 +11,7 @@ #include "token/token.hpp" #include +#include #include namespace parser { @@ -23,7 +24,7 @@ namespace parser { ~parser(); std::vector errors; - ast::program* parse_program(); + std::unique_ptr parse_program(); private: lexer::lexer& lexer; diff --git a/test/parser/let.cpp b/test/parser/let.cpp index ca4c0c3..a1e19ae 100644 --- a/test/parser/let.cpp +++ b/test/parser/let.cpp @@ -7,6 +7,7 @@ #include "utils.hpp" #include +#include #include void test_let_statement(ast::statement* stmt, const std::string name) { @@ -27,7 +28,7 @@ void test_failing_let_parsing( lexer::lexer l{input}; parser::parser p{l}; - ast::program* program = p.parse_program(); + std::unique_ptr program = p.parse_program(); // Check for errors REQUIRE(p.errors.size() == expected_types.size()); @@ -45,7 +46,6 @@ void test_failing_let_parsing( "parse_program() returned a null pointer" ); REQUIRE(program->statements.size() == n_good_statements); - delete program; } TEST_SUITE("Parser: let") { diff --git a/test/parser/utils.cpp b/test/parser/utils.cpp index f3f0ecf..bd7a458 100644 --- a/test/parser/utils.cpp +++ b/test/parser/utils.cpp @@ -18,8 +18,8 @@ void check_parser_errors(const std::vector& errors) { void ParserFixture::setup(std::string source) { input << source; - lexer = new lexer::lexer{input}; - parser = new parser::parser(*lexer); + lexer = std::make_unique(input); + parser = std::make_unique(*lexer); program = parser->parse_program(); check_parser_errors(parser->errors); @@ -30,9 +30,3 @@ void ParserFixture::setup(std::string source) { "parse_program() returned a null pointer" ); } - -ParserFixture::~ParserFixture() { - delete lexer; - delete parser; - delete program; -} diff --git a/test/parser/utils.hpp b/test/parser/utils.hpp index 9e1fb7b..d8e2efa 100644 --- a/test/parser/utils.hpp +++ b/test/parser/utils.hpp @@ -52,13 +52,11 @@ T* cast(ast::error::error* err) { struct ParserFixture { std::stringstream input; - lexer::lexer* lexer = nullptr; - parser::parser* parser = nullptr; - ast::program* program = nullptr; + std::unique_ptr lexer; + std::unique_ptr parser; + std::unique_ptr program; ParserFixture() = default; void setup(std::string); - - ~ParserFixture(); };