From 31cb4836023015e46b5976a6be0746ae2dc06030 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Tue, 8 Jul 2025 10:17:38 +0200 Subject: [PATCH] added string function to all nodes of ast --- src/ast/ast.hpp | 3 +++ src/ast/expressions/identifier.cpp | 4 ++++ src/ast/expressions/identifier.hpp | 1 + src/ast/program.cpp | 10 ++++++++++ src/ast/program.hpp | 3 ++- src/ast/statements/expression.cpp | 11 +++++++++++ src/ast/statements/expression.hpp | 1 + src/ast/statements/let.cpp | 12 ++++++++++++ src/ast/statements/let.hpp | 1 + src/ast/statements/return.cpp | 12 ++++++++++++ src/ast/statements/return.hpp | 2 ++ src/lexer/lexer.hpp | 1 + 12 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp index a261b34..5820195 100644 --- a/src/ast/ast.hpp +++ b/src/ast/ast.hpp @@ -5,14 +5,17 @@ namespace ast { struct node { virtual std::string token_literal() const = 0; + virtual std::string str() const = 0; virtual ~node() = default; }; struct statement : node { virtual std::string token_literal() const override = 0; + virtual std::string str() const override = 0; }; struct expression : node { virtual std::string token_literal() const override = 0; + virtual std::string str() const override = 0; }; } // namespace ast diff --git a/src/ast/expressions/identifier.cpp b/src/ast/expressions/identifier.cpp index b54d573..08cb6a9 100644 --- a/src/ast/expressions/identifier.cpp +++ b/src/ast/expressions/identifier.cpp @@ -8,4 +8,8 @@ namespace ast { std::string identifier::token_literal() const { return token.literal; } + + std::string identifier::str() const { + return value; + }; } // namespace ast diff --git a/src/ast/expressions/identifier.hpp b/src/ast/expressions/identifier.hpp index 22409cd..2d006fe 100644 --- a/src/ast/expressions/identifier.hpp +++ b/src/ast/expressions/identifier.hpp @@ -12,5 +12,6 @@ namespace ast { std::string value; std::string token_literal() const override; + std::string str() const override; }; } // namespace ast diff --git a/src/ast/program.cpp b/src/ast/program.cpp index 5c83cf2..e1092c4 100644 --- a/src/ast/program.cpp +++ b/src/ast/program.cpp @@ -1,5 +1,7 @@ #include "program.hpp" +#include + namespace ast { std::string program ::token_literal() const { if (statements.size() > 0) @@ -11,4 +13,12 @@ namespace ast { for (const auto& ref : statements) delete ref; }; + + std::string program::str() const { + std::stringstream ss; + for (const auto& stmt : statements) + ss << stmt->str(); + + return ss.str(); + }; } // namespace ast diff --git a/src/ast/program.hpp b/src/ast/program.hpp index bc809dc..f84238f 100644 --- a/src/ast/program.hpp +++ b/src/ast/program.hpp @@ -9,7 +9,8 @@ namespace ast { struct program : public node { std::vector statements; std::string token_literal() const override; - virtual std::string str() const override = 0; + + virtual std::string str() const override; ~program(); }; diff --git a/src/ast/statements/expression.cpp b/src/ast/statements/expression.cpp index 0927058..c3f57f4 100644 --- a/src/ast/statements/expression.cpp +++ b/src/ast/statements/expression.cpp @@ -1,5 +1,7 @@ #include "expression.hpp" +#include + namespace ast { expression_stmt::expression_stmt(token::token token) @@ -13,4 +15,13 @@ namespace ast { expression_stmt::~expression_stmt() { delete expression; } + + std::string expression_stmt::str() const { + std::stringstream ss; + + if (expression != nullptr) + ss << expression->str(); + + return ss.str(); + }; } // namespace ast diff --git a/src/ast/statements/expression.hpp b/src/ast/statements/expression.hpp index eaec59c..cab7ed5 100644 --- a/src/ast/statements/expression.hpp +++ b/src/ast/statements/expression.hpp @@ -11,6 +11,7 @@ namespace ast { ast::expression* expression; std::string token_literal() const override; + std::string str() const override; ~expression_stmt(); }; diff --git a/src/ast/statements/let.cpp b/src/ast/statements/let.cpp index 12b132f..de564a0 100644 --- a/src/ast/statements/let.cpp +++ b/src/ast/statements/let.cpp @@ -1,5 +1,7 @@ #include "let.hpp" +#include + namespace ast { let_stmt::let_stmt(token::token token) : token(std::move(token)), @@ -14,4 +16,14 @@ namespace ast { delete name; delete value; }; + + std::string let_stmt::str() const { + std::stringstream ss; + + ss << token_literal() << ' ' << name->str() << " = "; + if (value != nullptr) + ss << value->str(); + + return ss.str(); + }; } // namespace ast diff --git a/src/ast/statements/let.hpp b/src/ast/statements/let.hpp index 6632cf4..f520b7b 100644 --- a/src/ast/statements/let.hpp +++ b/src/ast/statements/let.hpp @@ -13,6 +13,7 @@ namespace ast { expression* value; std::string token_literal() const override; + std::string str() const override; ~let_stmt(); }; diff --git a/src/ast/statements/return.cpp b/src/ast/statements/return.cpp index 16a3cc4..41f4889 100644 --- a/src/ast/statements/return.cpp +++ b/src/ast/statements/return.cpp @@ -1,5 +1,7 @@ #include "return.hpp" +#include + namespace ast { return_stmt::return_stmt(token::token token) : token(std::move(token)), @@ -12,4 +14,14 @@ namespace ast { return_stmt::~return_stmt() { delete value; }; + + std::string return_stmt::str() const { + std::stringstream ss; + + ss << token_literal() << " "; + if (value != nullptr) + ss << value->str(); + + return ss.str(); + }; } // namespace ast diff --git a/src/ast/statements/return.hpp b/src/ast/statements/return.hpp index 58747a5..d5ef478 100644 --- a/src/ast/statements/return.hpp +++ b/src/ast/statements/return.hpp @@ -1,3 +1,4 @@ +#pragma once #include "ast/ast.hpp" #include "token/token.hpp" @@ -10,6 +11,7 @@ namespace ast { expression* value; std::string token_literal() const override; + std::string str() const override; ~return_stmt(); }; diff --git a/src/lexer/lexer.hpp b/src/lexer/lexer.hpp index fe9adeb..259f80d 100644 --- a/src/lexer/lexer.hpp +++ b/src/lexer/lexer.hpp @@ -1,4 +1,5 @@ #pragma once + #include "token/token.hpp" #include