picceler
Loading...
Searching...
No Matches
ast.h
Go to the documentation of this file.
1#pragma once
2
3#include "error.h"
4
5#include <vector>
6#include <string>
7#include <optional>
8#include <memory>
9#include <ranges>
10
11namespace picceler {
12
13template <typename T> auto getRawPointers(const std::vector<std::unique_ptr<T>> &vec) {
14 return vec | std::views::transform([](const std::unique_ptr<T> &ptr) { return ptr.get(); });
15}
16
20class ASTNode {
21public:
22 ASTNode() : _location() {}
23 virtual ~ASTNode() = default;
24 ASTNode(Location loc) : _location(loc) {}
25
26 ASTNode(const ASTNode &) = delete;
27 ASTNode &operator=(const ASTNode &) = delete;
28 ASTNode(ASTNode &&) = default;
29 ASTNode &operator=(ASTNode &&) = default;
30
31 virtual std::string toString() const = 0;
32
33 Location location() const { return _location; }
34
35private:
36 Location _location;
37};
38
42
43class ModuleNode : public ASTNode {
44public:
45 ModuleNode(Location loc) : ASTNode(loc), _statements() {}
46
47 auto statements() const { return getRawPointers(_statements); }
48
50
52 void addStatement(std::unique_ptr<ASTNode> statement) { _statements.push_back(std::move(statement)); }
53
54 std::string toString() const override;
55
56private:
57 std::vector<std::unique_ptr<ASTNode>> _statements;
58};
59
63class FunctionNode : public ASTNode {
64public:
65 FunctionNode(Location loc, std::string name) : ASTNode(loc), _name(std::move(name)) {}
66
67 const std::string &name() const { return _name; }
68 const auto &parameters() const { return _parameters; }
69 auto body() const { return getRawPointers(_body); }
70
71 void addParameter(const std::string &paramName, const std::string &paramType) {
72 _parameters.emplace_back(paramName, paramType);
73 }
74
75 void addBodyStatement(std::unique_ptr<ASTNode> statement) { _body.push_back(std::move(statement)); }
76
77 std::string toString() const override;
78
79private:
80 std::string _name;
81 std::vector<std::pair<std::string, std::string>> _parameters;
82 std::vector<std::unique_ptr<ASTNode>> _body;
83};
84
88class VariableNode : public ASTNode {
89public:
90 VariableNode(Location loc, std::string name, std::optional<std::string> type = std::nullopt)
91 : ASTNode(loc), _name(std::move(name)), _type(std::move(type)) {}
92
93 const std::string &name() const { return _name; }
94 const std::optional<std::string> &type() const { return _type; }
95
96 std::string toString() const override;
97
98private:
99 std::string _name;
100 std::optional<std::string> _type; // optional type annotation
101};
102
106class StringNode : public ASTNode {
107public:
108 StringNode(Location loc, std::string value) : ASTNode(loc), _value(std::move(value)) {}
109
110 const std::string &value() const { return _value; }
111
112 std::string toString() const override;
113
114private:
115 std::string _value;
116};
117
121class NumberNode : public ASTNode {
122public:
123 NumberNode(Location loc, double value) : ASTNode(loc), _value(value) {}
124
125 double value() const { return _value; }
126
127 std::string toString() const override;
128
129private:
130 double _value;
131};
132
136class AssignmentNode : public ASTNode {
137public:
138 AssignmentNode(Location loc, std::unique_ptr<VariableNode> lhs, std::unique_ptr<ASTNode> rhs)
139 : ASTNode(loc), _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
140
141 VariableNode *lhs() const { return _lhs.get(); }
142 ASTNode *rhs() const { return _rhs.get(); }
143
144 std::string toString() const override;
145
146private:
147 std::unique_ptr<VariableNode> _lhs;
148 std::unique_ptr<ASTNode> _rhs;
149};
150
154class CallNode : public ASTNode {
155public:
156 CallNode(Location loc, std::string callee) : ASTNode(loc), _callee(std::move(callee)), _arguments() {}
157
158 const std::string &callee() const { return _callee; }
159 auto arguments() const { return getRawPointers(_arguments); }
160
161 void addArgument(std::unique_ptr<ASTNode> arg) { _arguments.push_back(std::move(arg)); }
162
163 std::string toString() const override;
164
165private:
166 std::string _callee;
167 std::vector<std::unique_ptr<ASTNode>> _arguments;
168};
169
173
174class KernelNode : public ASTNode {
175public:
176 KernelNode(Location loc) : ASTNode(loc), _rows() {}
177 const std::vector<std::vector<double>> &rows() const { return _rows; }
178
179 void addRow(const std::vector<double> &row) { _rows.push_back(row); }
180
181 std::string toString() const override;
182
183private:
184 std::vector<std::vector<double>> _rows;
185};
186
190class BinaryOpNode : public ASTNode {
191public:
192 BinaryOpNode(Location loc, std::string op, std::unique_ptr<ASTNode> lhs, std::unique_ptr<ASTNode> rhs)
193 : ASTNode(loc), _op(std::move(op)), _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
194
195 const std::string &op() const { return _op; }
196 ASTNode *lhs() const { return _lhs.get(); }
197 ASTNode *rhs() const { return _rhs.get(); }
198
199 std::string toString() const override;
200
201private:
202 std::string _op;
203 std::unique_ptr<ASTNode> _lhs;
204 std::unique_ptr<ASTNode> _rhs;
205};
206
210class IfNode : public ASTNode {
211public:
212 IfNode(Location loc, std::unique_ptr<ASTNode> condition, std::vector<std::unique_ptr<ASTNode>> body)
213 : ASTNode(loc), _condition(std::move(condition)), _body(std::move(body)) {}
214
215 ASTNode *condition() const { return _condition.get(); }
216 auto body() const { return getRawPointers(_body); }
217
218 std::string toString() const override;
219
220private:
221 std::unique_ptr<ASTNode> _condition;
222 std::vector<std::unique_ptr<ASTNode>> _body;
223};
224
225} // namespace picceler
ASTNode(const ASTNode &)=delete
ASTNode(ASTNode &&)=default
ASTNode(Location loc)
Definition ast.h:24
ASTNode & operator=(ASTNode &&)=default
ASTNode()
Definition ast.h:22
Location location() const
Definition ast.h:33
virtual std::string toString() const =0
virtual ~ASTNode()=default
ASTNode & operator=(const ASTNode &)=delete
AssignmentNode(Location loc, std::unique_ptr< VariableNode > lhs, std::unique_ptr< ASTNode > rhs)
Definition ast.h:138
std::string toString() const override
Definition ast.cpp:92
ASTNode * rhs() const
Definition ast.h:142
VariableNode * lhs() const
Definition ast.h:141
const std::string & op() const
Definition ast.h:195
ASTNode * rhs() const
Definition ast.h:197
std::string toString() const override
Definition ast.cpp:123
ASTNode * lhs() const
Definition ast.h:196
BinaryOpNode(Location loc, std::string op, std::unique_ptr< ASTNode > lhs, std::unique_ptr< ASTNode > rhs)
Definition ast.h:192
const std::string & callee() const
Definition ast.h:158
auto arguments() const
Definition ast.h:159
void addArgument(std::unique_ptr< ASTNode > arg)
Definition ast.h:161
CallNode(Location loc, std::string callee)
Definition ast.h:156
std::string toString() const override
Definition ast.cpp:96
const auto & parameters() const
Definition ast.h:68
FunctionNode(Location loc, std::string name)
Definition ast.h:65
void addParameter(const std::string &paramName, const std::string &paramType)
Definition ast.h:71
std::string toString() const override
Definition ast.cpp:69
auto body() const
Definition ast.h:69
const std::string & name() const
Definition ast.h:67
void addBodyStatement(std::unique_ptr< ASTNode > statement)
Definition ast.h:75
auto body() const
Definition ast.h:216
std::string toString() const override
Definition ast.cpp:127
ASTNode * condition() const
Definition ast.h:215
IfNode(Location loc, std::unique_ptr< ASTNode > condition, std::vector< std::unique_ptr< ASTNode > > body)
Definition ast.h:212
const std::vector< std::vector< double > > & rows() const
Definition ast.h:177
void addRow(const std::vector< double > &row)
Definition ast.h:179
KernelNode(Location loc)
Definition ast.h:176
std::string toString() const override
Definition ast.cpp:107
Struct to hold location information.
Definition error.h:10
void normalizeTopLevelStatements()
Definition ast.cpp:11
auto statements() const
Definition ast.h:47
ModuleNode(Location loc)
Definition ast.h:45
void addStatement(std::unique_ptr< ASTNode > statement)
Definition ast.h:52
std::string toString() const override
Definition ast.cpp:9
bool wrapTopLevelStatementsInMain()
Definition ast.cpp:25
NumberNode(Location loc, double value)
Definition ast.h:123
std::string toString() const override
Definition ast.cpp:90
double value() const
Definition ast.h:125
StringNode(Location loc, std::string value)
Definition ast.h:108
std::string toString() const override
Definition ast.cpp:88
const std::string & value() const
Definition ast.h:110
AST node for variable references.
Definition ast.h:88
VariableNode(Location loc, std::string name, std::optional< std::string > type=std::nullopt)
Definition ast.h:90
const std::string & name() const
Definition ast.h:93
std::string toString() const override
Definition ast.cpp:86
const std::optional< std::string > & type() const
Definition ast.h:94
Definition ast.h:11
auto getRawPointers(const std::vector< std::unique_ptr< T > > &vec)
Definition ast.h:13