From 7a90247dc0736843cda02ccfb0f39b338e35f5ca Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 7 Nov 2026 21:02:02 +0200 Subject: [PATCH] lab5: improve weighting during compilation, fix assembly operator translation bug --- inc/dyn-pipeline.hpp | 2 +- inc/syntaxer.hpp | 2 ++ src/assembler.cpp | 2 +- src/dyn-pipeline.cpp | 7 +++++++ src/syntaxer.cpp | 33 ++++++++++++++++++++++++++++++++- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/inc/dyn-pipeline.hpp b/inc/dyn-pipeline.hpp index 7076baa..a531e67 100644 --- a/inc/dyn-pipeline.hpp +++ b/inc/dyn-pipeline.hpp @@ -43,7 +43,7 @@ class System private: std::vector *program_memory; std::array data_memory; - std::array delays {2, 2, 5, 5, 9}; + std::array delays; std::array layer_cmd {-1}; unsigned int pc {0}; unsigned int system_time; diff --git a/inc/syntaxer.hpp b/inc/syntaxer.hpp index ba53b10..f741673 100644 --- a/inc/syntaxer.hpp +++ b/inc/syntaxer.hpp @@ -2,6 +2,7 @@ #include #include "expression.hpp" +#include "dyn-pipeline.hpp" namespace Syntax { @@ -10,5 +11,6 @@ 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); +int op_weight(DynamicPipeline::CommandType o); } diff --git a/src/assembler.cpp b/src/assembler.cpp index fb772b5..ad8f1cf 100644 --- a/src/assembler.cpp +++ b/src/assembler.cpp @@ -60,7 +60,7 @@ int descend_operator(const Expression::TreeNode& node, int& preload_mem, std::ve ro = PRELOAD; } - commands.emplace_back((DynamicPipeline::CommandType) (node.o.t - 2), lo, ro, left, right); + commands.emplace_back((DynamicPipeline::CommandType) (node.o.v.o - 2), lo, ro, left, right); return commands.size() - 1; // this index in dynamic memory } diff --git a/src/dyn-pipeline.cpp b/src/dyn-pipeline.cpp index 0ba37b1..7927f9c 100644 --- a/src/dyn-pipeline.cpp +++ b/src/dyn-pipeline.cpp @@ -22,6 +22,13 @@ void System::init(const std::vector * const prg, const std::array& v) return idx; } + +static int op_weight(enum Expression::Token::Operator o) +{ + switch (o) + { + case Expression::Token::OPA: + case Expression::Token::CPA: + case Expression::Token::NOP: + pr_warn("Unweightable operator - this is probably a bug!"); + return 0; + case Expression::Token::ADD: + return 1; + case Expression::Token::SUB: + return 1; + case Expression::Token::MUL: + return 2; + case Expression::Token::DIV: + return 2; + case Expression::Token::POW: + return 3; + default: + pr_warn("Impossible operator - this is a bug!"); + return 0; + } +} + +int op_weight(DynamicPipeline::CommandType o) +{ + return op_weight((enum Expression::Token::Operator) (o + 2)); +} + static int write_operation( std::vector& ov, std::vector& cv, @@ -322,7 +353,7 @@ static int write_operation( return 1; } #endif - int this_op_weight = get_operator_weight(mv, location) + 1; + int this_op_weight = get_operator_weight(mv, location) + op_weight(o.v.o); int il = l.t == Expression::Token::CV ? l.v.cv.i : left_location; int ir = r.t == Expression::Token::CV ? r.v.cv.i : right_location;