added a way to show the call stack of the functions

This commit is contained in:
Karma Riuk
2025-07-11 19:48:55 +02:00
parent c9ffeafd5f
commit 6cd99c22fe
3 changed files with 35 additions and 0 deletions

View File

@@ -7,6 +7,7 @@
#include "ast/expressions/prefix.hpp" #include "ast/expressions/prefix.hpp"
#include "token/token.hpp" #include "token/token.hpp"
#include "token/type.hpp" #include "token/type.hpp"
#include "utils/tracer.hpp"
#include <sstream> #include <sstream>
@@ -108,6 +109,7 @@ namespace parser {
} }
ast::expression* parser::parse_expression(precedence prec) { ast::expression* parser::parse_expression(precedence prec) {
// TRACE_FUNCTION;
auto prefix_it = prefix_parse_fns.find(current.type); auto prefix_it = prefix_parse_fns.find(current.type);
if (prefix_it == prefix_parse_fns.end()) { if (prefix_it == prefix_parse_fns.end()) {
unkown_prefix_error(current); unkown_prefix_error(current);
@@ -166,6 +168,7 @@ namespace parser {
} }
ast::expression_stmt* parser::parse_expression_stmt() { ast::expression_stmt* parser::parse_expression_stmt() {
// TRACE_FUNCTION;
ast::expression_stmt* stmt = new ast::expression_stmt(current); ast::expression_stmt* stmt = new ast::expression_stmt(current);
stmt->expression = parse_expression(); stmt->expression = parse_expression();
@@ -216,10 +219,12 @@ namespace parser {
}; };
ast::expression* parser::parse_integer() { ast::expression* parser::parse_integer() {
// TRACE_FUNCTION;
return new ast::integer_literal(current, std::stoi(current.literal)); return new ast::integer_literal(current, std::stoi(current.literal));
}; };
ast::expression* parser::parse_prefix_expr() { ast::expression* parser::parse_prefix_expr() {
// TRACE_FUNCTION;
ast::prefix_expr* ret = new ast::prefix_expr(current, current.literal); ast::prefix_expr* ret = new ast::prefix_expr(current, current.literal);
next_token(); next_token();
ret->right = parse_expression(precedence::PREFIX); ret->right = parse_expression(precedence::PREFIX);
@@ -227,6 +232,7 @@ namespace parser {
}; };
ast::expression* parser::parse_infix_expr(ast::expression* left) { ast::expression* parser::parse_infix_expr(ast::expression* left) {
// TRACE_FUNCTION;
ast::infix_expr* ret = ast::infix_expr* ret =
new ast::infix_expr(current, current.literal, left); new ast::infix_expr(current, current.literal, left);
precedence prec = precedence_for(current.type); precedence prec = precedence_for(current.type);

22
src/utils/tracer.hpp Normal file
View File

@@ -0,0 +1,22 @@
#include <iostream>
#include <string>
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__);

View File

@@ -205,4 +205,11 @@ TEST_SUITE("Parser: expression") {
CHECK(program->str() == t.expected); 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))");
}
} }