From 6cd99c22fe219de6f374daeeb5d90ff8665222c5 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Fri, 11 Jul 2025 19:48:55 +0200 Subject: [PATCH] added a way to show the call stack of the functions --- src/parser/parser.cpp | 6 ++++++ src/utils/tracer.hpp | 22 ++++++++++++++++++++++ test/parser/expression.cpp | 7 +++++++ 3 files changed, 35 insertions(+) create mode 100644 src/utils/tracer.hpp diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index aea0601..06fd6a9 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -7,6 +7,7 @@ #include "ast/expressions/prefix.hpp" #include "token/token.hpp" #include "token/type.hpp" +#include "utils/tracer.hpp" #include @@ -108,6 +109,7 @@ namespace parser { } ast::expression* parser::parse_expression(precedence prec) { + // TRACE_FUNCTION; auto prefix_it = prefix_parse_fns.find(current.type); if (prefix_it == prefix_parse_fns.end()) { unkown_prefix_error(current); @@ -166,6 +168,7 @@ namespace parser { } ast::expression_stmt* parser::parse_expression_stmt() { + // TRACE_FUNCTION; ast::expression_stmt* stmt = new ast::expression_stmt(current); stmt->expression = parse_expression(); @@ -216,10 +219,12 @@ namespace parser { }; ast::expression* parser::parse_integer() { + // TRACE_FUNCTION; return new ast::integer_literal(current, std::stoi(current.literal)); }; ast::expression* parser::parse_prefix_expr() { + // TRACE_FUNCTION; ast::prefix_expr* ret = new ast::prefix_expr(current, current.literal); next_token(); ret->right = parse_expression(precedence::PREFIX); @@ -227,6 +232,7 @@ namespace parser { }; ast::expression* parser::parse_infix_expr(ast::expression* left) { + // TRACE_FUNCTION; ast::infix_expr* ret = new ast::infix_expr(current, current.literal, left); precedence prec = precedence_for(current.type); diff --git a/src/utils/tracer.hpp b/src/utils/tracer.hpp new file mode 100644 index 0000000..b8b2dac --- /dev/null +++ b/src/utils/tracer.hpp @@ -0,0 +1,22 @@ + +#include +#include + +namespace { + struct FunctionTracer { + std::string name; + inline static int tab_counter = 0; + + FunctionTracer(const std::string& func): name(func) { + std::cout << std::string(tab_counter++, '\t') << "BEGIN " << name + << std::endl; + } + + ~FunctionTracer() { + std::cout << std::string(--tab_counter, '\t') << "Exiting " << name + << std::endl; + } + }; +} // namespace + +#define TRACE_FUNCTION FunctionTracer tracer(__FUNCTION__); diff --git a/test/parser/expression.cpp b/test/parser/expression.cpp index de29f9e..35557b1 100644 --- a/test/parser/expression.cpp +++ b/test/parser/expression.cpp @@ -205,4 +205,11 @@ TEST_SUITE("Parser: expression") { CHECK(program->str() == t.expected); } } + + TEST_CASE_FIXTURE(ParserFixture, "Test to see trace") { + setup("-1 * 2 - 3"); + CHECK(program->str() == "(((-1) * 2) - 3)"); + setup("-1 - 2 * 3"); + CHECK(program->str() == "((-1) - (2 * 3))"); + } }