unify operator weights, add recursive weight method to TreeNode
This commit is contained in:
@@ -43,7 +43,6 @@ class System
|
||||
private:
|
||||
std::vector<Command> *program_memory;
|
||||
std::array<MemCell, DYN_PIPELINE_MEM_SIZE> data_memory;
|
||||
std::array<int, CMD_COUNT> delays;
|
||||
std::array<int, DYN_PIPELINE_LAYERS> layer_cmd {-1};
|
||||
unsigned int pc {0};
|
||||
unsigned int system_time;
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "print.h"
|
||||
|
||||
namespace Expression {
|
||||
|
||||
class Token {
|
||||
@@ -28,6 +30,31 @@ public:
|
||||
NOP // not an operator
|
||||
};
|
||||
|
||||
static int weight_op(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;
|
||||
}
|
||||
}
|
||||
|
||||
union TokenValue {
|
||||
std::shared_ptr<std::string> s;
|
||||
double d;
|
||||
@@ -380,6 +407,28 @@ public:
|
||||
delete r;
|
||||
}
|
||||
}
|
||||
|
||||
int weight()
|
||||
{
|
||||
int w = 0;
|
||||
|
||||
if (l != nullptr)
|
||||
{
|
||||
w += l->weight();
|
||||
}
|
||||
|
||||
if (r != nullptr)
|
||||
{
|
||||
w += r->weight();
|
||||
}
|
||||
|
||||
if (o.t == Token::OPERATOR)
|
||||
{
|
||||
Token::weight_op(o.v.o);
|
||||
}
|
||||
|
||||
return w;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
#include <vector>
|
||||
#include "expression.hpp"
|
||||
#include "dyn-pipeline.hpp"
|
||||
|
||||
namespace Syntax
|
||||
{
|
||||
@@ -11,6 +10,5 @@ int prepare_token_vector(std::vector<Expression::Token>& tv);
|
||||
std::vector<Expression::Operation> build_op_vector(const std::vector<Expression::Token>& tv);
|
||||
Expression::TreeNode ov_to_tree(const std::vector<Expression::Token>& tv, const std::vector<Expression::Operation>& ov);
|
||||
void print_op_tree(const std::vector<Expression::Token>& tv, const std::vector<Expression::Operation>& ov);
|
||||
int op_weight(DynamicPipeline::CommandType o);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user