tcalc 0.2.0
 
Loading...
Searching...
No Matches
base.hpp
Go to the documentation of this file.
1
12#pragma once
13
14#include <memory>
15
19#include "tcalc/ast/node.hpp"
20#include "tcalc/ast/number.hpp"
21#include "tcalc/ast/program.hpp"
22#include "tcalc/ast/unaryop.hpp"
24#include "tcalc/error.hpp"
25
26#define __check_node_type(node, type, entry) \
27 if (auto node_type = std::dynamic_pointer_cast<type>(node)) { \
28 return entry(node_type); \
29 }
30
31#define VISIT_DEFAULT(node) \
32 { \
33 (void)node; \
34 return error::ok<RT>(); \
35 }
36
37namespace tcalc::ast {
38
44template<typename RT>
46{
47public:
48 virtual ~BaseVisitor() = default;
49
57 {
58 __check_node_type(node, BinaryOpNode, visit_bin_op);
59 __check_node_type(node, UnaryOpNode, visit_unary_op);
60 __check_node_type(node, NumberNode, visit_number);
61 __check_node_type(node, VarRefNode, visit_varref);
62 __check_node_type(node, VarAssignNode, visit_varassign);
63 __check_node_type(node, FcallNode, visit_fcall);
64 __check_node_type(node, FdefNode, visit_fdef);
65 __check_node_type(node, IfNode, visit_if);
66 __check_node_type(node, ProgramNode, visit_program);
67 __check_node_type(node, ProgramImportNode, visit_import);
68
69 return error::ok<RT>();
70 }
71
79 VISIT_DEFAULT(node);
80
88 VISIT_DEFAULT(node);
89
97 VISIT_DEFAULT(node);
98
106 VISIT_DEFAULT(node);
107
115 VISIT_DEFAULT(node);
116
124 VISIT_DEFAULT(node);
125
133 VISIT_DEFAULT(node);
134
141 virtual error::Result<RT> visit_if(NodePtr<IfNode>& node) VISIT_DEFAULT(node);
142
150 VISIT_DEFAULT(node);
151
159 VISIT_DEFAULT(node);
160};
161
162}
Binary operation node.
Base visitor class with default return type.
Definition base.hpp:46
virtual error::Result< RT > visit_unary_op(NodePtr< UnaryOpNode > &node) VISIT_DEFAULT(node)
Visit a unary operation node.
virtual error::Result< RT > visit_fcall(NodePtr< FcallNode > &node) VISIT_DEFAULT(node)
Visit a function call node.
virtual error::Result< RT > visit_number(NodePtr< NumberNode > &node) VISIT_DEFAULT(node)
Visit a number node.
virtual error::Result< RT > visit_import(NodePtr< ProgramImportNode > &node) VISIT_DEFAULT(node)
Visit a program import node.
virtual error::Result< RT > visit_varassign(NodePtr< VarAssignNode > &node) VISIT_DEFAULT(node)
Visit a variable assignment node.
virtual error::Result< RT > visit_program(NodePtr< ProgramNode > &node) VISIT_DEFAULT(node)
Visit a program node.
virtual error::Result< RT > visit_fdef(NodePtr< FdefNode > &node) VISIT_DEFAULT(node)
Visit a function definition node.
virtual error::Result< RT > visit_varref(NodePtr< VarRefNode > &node) VISIT_DEFAULT(node)
Visit a variable reference node.
virtual error::Result< RT > visit(NodePtr<> &node)
Visit a number node.
Definition base.hpp:56
virtual error::Result< RT > visit_if(NodePtr< IfNode > &node) VISIT_DEFAULT(node)
Visit an if node.
virtual error::Result< RT > visit_bin_op(NodePtr< BinaryOpNode > &node) VISIT_DEFAULT(node)
Visit a binary operation node.
Binary operation base class.
Definition binaryop.hpp:26
Function node.
Definition function.hpp:28
Function definition node.
Definition function.hpp:100
If node.
Definition control_flow.hpp:26
Number AST node.
Definition number.hpp:24
Program import node.
Definition program.hpp:86
Program node.
Definition program.hpp:26
Unary operation node.
Definition unaryop.hpp:25
Variable assign node.
Definition variable.hpp:65
Variable node.
Definition variable.hpp:27
Control flow nodes.
tcalc error definition.
_TCALC_EXPECTED_NS::expected< T, Error > Result
Result type.
Definition error.hpp:153
Function node.
Base class for AST nodes.
std::shared_ptr< NT > NodePtr
Shared pointer to a node.
Definition node.hpp:119
Number AST node.
Program node.
Unary operation node.
Variable node.