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
18
#include "
tcalc/ast/binaryop.hpp
"
19
#include "
tcalc/ast/node.hpp
"
20
#include "
tcalc/builtins.hpp
"
21
#include "
tcalc/common.hpp
"
22
#include "
tcalc/eval.hpp
"
23
#include "
tcalc/visitor/base.hpp
"
24
25
namespace
tcalc::ast {
26
31
class
TCALC_PUBLIC
EvalVisitor
:
public
BaseVisitor
<double>
32
{
33
private
:
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
80
public
:
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
};
106
private
:
107
EvalContext
* _ctx;
108
109
public
:
115
EvalVisitor
(
EvalContext
& ctx)
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
138
class
TCALC_PUBLIC
ProgramEvalVisitor
:
public
BaseVisitor
<std::vector<double>>
139
{
140
private
:
141
EvalContext
* _ctx;
142
143
public
:
149
ProgramEvalVisitor
(
EvalContext
& ctx)
150
: _ctx{ &ctx }
151
{
152
}
153
154
~ProgramEvalVisitor
()
override
=
default
;
155
156
error::Result<std::vector<double>
> visit_program(
157
NodePtr<ProgramNode>
& node)
override
;
158
};
159
160
}
base.hpp
Base visitor class.
binaryop.hpp
Binary operation node.
builtins.hpp
Built-in functions and variables.
tcalc::EvalContext
Evaluation context which stores variables and built-in functions.
Definition
eval.hpp:32
tcalc::ast::BaseVisitor
Base visitor class with default return type.
Definition
base.hpp:46
tcalc::ast::EvalVisitor
Visitor for evaluating AST.
Definition
eval.hpp:32
tcalc::ast::EvalVisitor::EvalVisitor
EvalVisitor(EvalContext &ctx)
Construct a new Eval Visitor object.
Definition
eval.hpp:115
tcalc::ast::ProgramEvalVisitor
Visitor for evaluating Program AST.
Definition
eval.hpp:139
tcalc::ast::ProgramEvalVisitor::ProgramEvalVisitor
ProgramEvalVisitor(EvalContext &ctx)
Construct a new Program Eval Visitor object.
Definition
eval.hpp:149
common.hpp
tcalc common header.
tcalc::error::Result
_TCALC_EXPECTED_NS::expected< T, Error > Result
Result type.
Definition
error.hpp:153
eval.hpp
Evaluator for tcalc.
node.hpp
Base class for AST nodes.
tcalc::ast::NodePtr
std::shared_ptr< NT > NodePtr
Shared pointer to a node.
Definition
node.hpp:119
tcalc::ast::NodeType
NodeType
AST node type.
Definition
node.hpp:30
include
tcalc
visitor
eval.hpp
Generated by
1.9.8