From 0f0dac6a250fbe9a7699959a2513bd8c17bd9a0d Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sun, 8 Nov 2026 17:31:25 +0200 Subject: [PATCH] add operation tree printing, fix wrong data linking during selective assembly --- inc/syntaxer.hpp | 2 +- src/assembler.cpp | 29 +++++++++++++++++++++++++---- src/main.cpp | 1 + src/syntaxer.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/inc/syntaxer.hpp b/inc/syntaxer.hpp index ba53b10..4394066 100644 --- a/inc/syntaxer.hpp +++ b/inc/syntaxer.hpp @@ -9,6 +9,6 @@ namespace Syntax int prepare_token_vector(std::vector& tv); std::vector build_op_vector(const std::vector& tv); Expression::TreeNode ov_to_tree(const std::vector& tv, const std::vector& ov); -void print_op_tree(const std::vector& tv, const std::vector& ov); +void print_op_tree(const Expression::TreeNode &node); } diff --git a/src/assembler.cpp b/src/assembler.cpp index 2219da3..6fa4fb8 100644 --- a/src/assembler.cpp +++ b/src/assembler.cpp @@ -90,13 +90,29 @@ void assemble( program.reserve(commands.size()); + std::vector command_used; + for (int i = 0, l = commands.size(); i < l; i++) + { + command_used.emplace_back(false); + } + for (int i = 0, l = commands.size(); i < l; i++) { int lowest_weight_idx = 0; - for (int j = 0, k = commands.size(); j < k; j++) + for (int j = 0; j < l; j++) { - if (commands[j].node->weight() < commands[lowest_weight_idx].node->weight()) + if (!command_used[j]) + { + pr_debug("Starting from " << j); + lowest_weight_idx = j; + break; + } + } + + for (int j = lowest_weight_idx + 1; j < l; j++) + { + if (!command_used[j] && commands[j].node->weight() < commands[lowest_weight_idx].node->weight()) { lowest_weight_idx = j; } @@ -104,9 +120,14 @@ void assemble( Command &cmd = commands[lowest_weight_idx]; pr_debug("Selecting command idx=" << lowest_weight_idx << " with weight=" << cmd.node->weight()); - program.emplace_back(cmd.opcode, cmd.left_src * preload_mem + cmd.left_index, cmd.right_src * preload_mem + cmd.right_index, preload_mem + i); + pr_debug(cmd.opcode << " " + << cmd.left_src << " " << cmd.left_index << " " + << cmd.right_src << " " << cmd.right_index << " " + << preload_mem + lowest_weight_idx); - commands.erase(commands.begin() + lowest_weight_idx); + program.emplace_back(cmd.opcode, cmd.left_src * preload_mem + cmd.left_index, cmd.right_src * preload_mem + cmd.right_index, preload_mem + lowest_weight_idx); + + command_used[lowest_weight_idx] = true; } } diff --git a/src/main.cpp b/src/main.cpp index 5f7b030..64d23cf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ int main(int argc, char **argv) std::vector ov = Syntax::build_op_vector(tv); Expression::TreeNode root = Syntax::ov_to_tree(tv, ov); + Syntax::print_op_tree(root); std::vector program; std::array memory; diff --git a/src/syntaxer.cpp b/src/syntaxer.cpp index 0538e63..ea5b9b3 100644 --- a/src/syntaxer.cpp +++ b/src/syntaxer.cpp @@ -1432,11 +1432,50 @@ Expression::TreeNode ov_to_tree(const std::vector& tv, const return root; } +static void descend_print_tree_node(const Expression::TreeNode& this_node, const int depth, const int leftnesses) +{ + prs_info(""); + + for (int i = 0; i < depth - 1; i++) + { + if (leftnesses & (1 << i)) + { + pri_info("│ "); + } + else + { + pri_info(" "); + } + } + + if (depth > 0) + { + if (leftnesses & (1 << (depth - 1))) + { + pri_info("├─"); + } + else + { + pri_info("└─"); + } + } + + pri_info(*this_node.o.to_math_str() << "\n"); + + if (this_node.l != nullptr) + { + descend_print_tree_node(*this_node.l, depth + 1, leftnesses | 1 << depth); + } + + if (this_node.r != nullptr) + { + descend_print_tree_node(*this_node.r, depth + 1, leftnesses); + } +} + void print_op_tree(const Expression::TreeNode& root) { - (void) root; - - std::vector> items_to_display; + descend_print_tree_node(root, 0, 0); } }