tcalc 0.2.0
 
Loading...
Searching...
No Matches
eval.hpp
Go to the documentation of this file.
1
12#pragma once
13
14#include <functional>
15#include <unordered_map>
16#include <vector>
17
19#include "tcalc/ast/node.hpp"
20#include "tcalc/builtins.hpp"
21#include "tcalc/common.hpp"
22#include "tcalc/eval.hpp"
24
25namespace tcalc::ast {
26
31class TCALC_PUBLIC EvalVisitor : public BaseVisitor<double>
32{
33private:
41 static double _double_eq(double a, double b);
42
51 static bool _double_eq_bool(double a, double b);
52
60 static double _double_noeq(double a, double b);
61
70 static bool _double_noeq_bool(double a, double b);
71
78 static double _double_forward(double a);
79
80public:
81 inline static const std::unordered_map<NodeType,
82 std::function<double(double, double)>>
83 BINOP_MAP = {
84 { NodeType::BINARY_PLUS, std::plus<>() },
85 { NodeType::BINARY_MINUS, std::minus<>() },
86 { NodeType::BINARY_MULTIPLY, std::multiplies<>() },
87 { NodeType::BINARY_DIVIDE, std::divides<>() },
88 { NodeType::BINARY_EQUAL, _double_eq },
89 { NodeType::BINARY_NOT_EQUAL, _double_noeq },
90 { NodeType::BINARY_GREATER, std::greater<>() },
91 { NodeType::BINARY_GREATER_EQUAL, std::greater_equal<>() },
92 { NodeType::BINARY_LESS, std::less<>() },
93 { NodeType::BINARY_LESS_EQUAL, std::less_equal<>() },
94 { NodeType::BINARY_AND, std::logical_and<>() },
95 { NodeType::BINARY_OR, std::logical_or<>() }
96 };
98 inline static const std::unordered_map<NodeType,
99 std::function<double(double)>>
100 UNARYOP_MAP = {
101 { NodeType::UNARY_PLUS, _double_forward },
102 { NodeType::UNARY_MINUS, std::negate<>() },
103 { NodeType::UNARY_NOT, std::logical_not<>() }
104 };
106private:
107 EvalContext* _ctx;
108
109public:
116 : _ctx{ &ctx }
117 {
118 }
119
120 ~EvalVisitor() override = default;
121
122 error::Result<double> visit_bin_op(NodePtr<BinaryOpNode>& node) override;
123 error::Result<double> visit_unary_op(NodePtr<UnaryOpNode>& node) override;
124 error::Result<double> visit_number(NodePtr<NumberNode>& node) override;
125 error::Result<double> visit_varref(NodePtr<VarRefNode>& node) override;
126 error::Result<double> visit_varassign(NodePtr<VarAssignNode>& node) override;
127 error::Result<double> visit_fcall(NodePtr<FcallNode>& node) override;
128 error::Result<double> visit_fdef(NodePtr<FdefNode>& node) override;
129 error::Result<double> visit_if(NodePtr<IfNode>& node) override;
130 error::Result<double> visit_import(NodePtr<ProgramImportNode>& node) override;
131 error::Result<double> visit_program(NodePtr<ProgramNode>& node) override;
132};
133
138class TCALC_PUBLIC ProgramEvalVisitor : public BaseVisitor<std::vector<double>>
139{
140private:
141 EvalContext* _ctx;
142
143public:
150 : _ctx{ &ctx }
151 {
152 }
153
154 ~ProgramEvalVisitor() override = default;
155
157 NodePtr<ProgramNode>& node) override;
158};
159
160}
Base visitor class.
Binary operation node.
Built-in functions and variables.
Evaluation context which stores variables and built-in functions.
Definition eval.hpp:32
Base visitor class with default return type.
Definition base.hpp:46
Visitor for evaluating AST.
Definition eval.hpp:32
EvalVisitor(EvalContext &ctx)
Construct a new Eval Visitor object.
Definition eval.hpp:115
Visitor for evaluating Program AST.
Definition eval.hpp:139
ProgramEvalVisitor(EvalContext &ctx)
Construct a new Program Eval Visitor object.
Definition eval.hpp:149
tcalc common header.
_TCALC_EXPECTED_NS::expected< T, Error > Result
Result type.
Definition error.hpp:153
Evaluator for tcalc.
Base class for AST nodes.
std::shared_ptr< NT > NodePtr
Shared pointer to a node.
Definition node.hpp:119
NodeType
AST node type.
Definition node.hpp:30