picceler
A compiled DSL for image processing, built on MLIR
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 const std::optional<std::string> &returnType() const { return _returnType; }
71
72 void addParameter(const std::string &paramName, const std::string &paramType) {
73 _parameters.emplace_back(paramName, paramType);
74 }
75
76 void addBodyStatement(std::unique_ptr<ASTNode> statement) { _body.push_back(std::move(statement)); }
77
78 void setReturnType(std::string returnType) { _returnType = std::move(returnType); }
79
80 std::string toString() const override;
81
82private:
83 std::string _name;
84 std::vector<std::pair<std::string, std::string>> _parameters;
85 std::vector<std::unique_ptr<ASTNode>> _body;
86 std::optional<std::string> _returnType;
87};
88
92class VariableNode : public ASTNode {
93public:
94 VariableNode(Location loc, std::string name, std::string type = "unspecified")
95 : ASTNode(loc), _name(std::move(name)), _type(std::move(type)) {}
96
97 const std::string &name() const { return _name; }
98 const std::string &type() const { return _type; }
99
100 std::string toString() const override;
101
102private:
103 std::string _name;
104 std::string _type;
105};
106
110class StringNode : public ASTNode {
111public:
112 StringNode(Location loc, std::string value) : ASTNode(loc), _value(std::move(value)) {}
113
114 const std::string &value() const { return _value; }
115
116 std::string toString() const override;
117
118private:
119 std::string _value;
120};
121
125class NumberNode : public ASTNode {
126public:
127 NumberNode(Location loc, double value) : ASTNode(loc), _value(value) {}
128
129 double value() const { return _value; }
130
131 std::string toString() const override;
132
133private:
134 double _value;
135};
136
140class AssignmentNode : public ASTNode {
141public:
142 AssignmentNode(Location loc, std::unique_ptr<VariableNode> lhs, std::unique_ptr<ASTNode> rhs)
143 : ASTNode(loc), _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
144
145 VariableNode *lhs() const { return _lhs.get(); }
146 ASTNode *rhs() const { return _rhs.get(); }
147
148 std::string toString() const override;
149
150private:
151 std::unique_ptr<VariableNode> _lhs;
152 std::unique_ptr<ASTNode> _rhs;
153};
154
158class CallNode : public ASTNode {
159public:
160 CallNode(Location loc, std::string callee) : ASTNode(loc), _callee(std::move(callee)), _arguments() {}
161
162 const std::string &callee() const { return _callee; }
163 auto arguments() const { return getRawPointers(_arguments); }
164
165 void addArgument(std::unique_ptr<ASTNode> arg) { _arguments.push_back(std::move(arg)); }
166
167 std::string toString() const override;
168
169private:
170 std::string _callee;
171 std::vector<std::unique_ptr<ASTNode>> _arguments;
172};
173
177
178class KernelNode : public ASTNode {
179public:
180 KernelNode(Location loc) : ASTNode(loc), _rows() {}
181 const std::vector<std::vector<double>> &rows() const { return _rows; }
182
183 void addRow(const std::vector<double> &row) { _rows.push_back(row); }
184
185 std::string toString() const override;
186
187private:
188 std::vector<std::vector<double>> _rows;
189};
190
194class BinaryOpNode : public ASTNode {
195public:
196 BinaryOpNode(Location loc, std::string op, std::unique_ptr<ASTNode> lhs, std::unique_ptr<ASTNode> rhs)
197 : ASTNode(loc), _op(std::move(op)), _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
198
199 const std::string &op() const { return _op; }
200 ASTNode *lhs() const { return _lhs.get(); }
201 ASTNode *rhs() const { return _rhs.get(); }
202
203 std::string toString() const override;
204
205private:
206 std::string _op;
207 std::unique_ptr<ASTNode> _lhs;
208 std::unique_ptr<ASTNode> _rhs;
209};
210
214class IfNode : public ASTNode {
215public:
216 IfNode(Location loc, std::unique_ptr<ASTNode> condition, std::vector<std::unique_ptr<ASTNode>> body,
217 std::vector<std::unique_ptr<ASTNode>> elseBody = {})
218 : ASTNode(loc), _condition(std::move(condition)), _body(std::move(body)), _elseBody(std::move(elseBody)) {}
219
220 ASTNode *condition() const { return _condition.get(); }
221 auto body() const { return getRawPointers(_body); }
222 auto elseBody() const { return getRawPointers(_elseBody); }
223
224 std::string toString() const override;
225
226private:
227 std::unique_ptr<ASTNode> _condition;
228 std::vector<std::unique_ptr<ASTNode>> _body;
229 std::vector<std::unique_ptr<ASTNode>> _elseBody;
230};
231
235class ForNode : public ASTNode {
236public:
237 ForNode(Location loc, std::string varName, std::unique_ptr<ASTNode> lowerBound, std::unique_ptr<ASTNode> upperBound,
238 std::unique_ptr<ASTNode> step, std::vector<std::unique_ptr<ASTNode>> body)
239 : ASTNode(loc), _varName(std::move(varName)), _lowerBound(std::move(lowerBound)),
240 _upperBound(std::move(upperBound)), _step(std::move(step)), _body(std::move(body)) {}
241
242 const std::string &varName() const { return _varName; }
243 ASTNode *lowerBound() const { return _lowerBound.get(); }
244 ASTNode *upperBound() const { return _upperBound.get(); }
245 ASTNode *step() const { return _step.get(); }
246 const std::vector<std::unique_ptr<ASTNode>> &body() const { return _body; }
247
248 std::string toString() const override;
249
250private:
251 std::string _varName;
252 std::unique_ptr<ASTNode> _lowerBound;
253 std::unique_ptr<ASTNode> _upperBound;
254 std::unique_ptr<ASTNode> _step;
255 std::vector<std::unique_ptr<ASTNode>> _body;
256};
257
261class ReturnNode : public ASTNode {
262public:
263 ReturnNode(Location loc, std::unique_ptr<ASTNode> returnValue) : ASTNode(loc), _returnValue(std::move(returnValue)) {}
264
265 ASTNode *returnValue() const { return _returnValue.get(); }
266
267 std::string toString() const override;
268
269private:
270 std::unique_ptr<ASTNode> _returnValue;
271};
272
273} // namespace picceler
Abstract Syntax Tree (AST) node base class.
Definition ast.h:20
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:142
std::string toString() const override
Definition ast.cpp:92
ASTNode * rhs() const
Definition ast.h:146
VariableNode * lhs() const
Definition ast.h:145
const std::string & op() const
Definition ast.h:199
ASTNode * rhs() const
Definition ast.h:201
std::string toString() const override
Definition ast.cpp:123
ASTNode * lhs() const
Definition ast.h:200
BinaryOpNode(Location loc, std::string op, std::unique_ptr< ASTNode > lhs, std::unique_ptr< ASTNode > rhs)
Definition ast.h:196
const std::string & callee() const
Definition ast.h:162
auto arguments() const
Definition ast.h:163
void addArgument(std::unique_ptr< ASTNode > arg)
Definition ast.h:165
CallNode(Location loc, std::string callee)
Definition ast.h:160
std::string toString() const override
Definition ast.cpp:96
ASTNode * upperBound() const
Definition ast.h:244
std::string toString() const override
Definition ast.cpp:147
ASTNode * step() const
Definition ast.h:245
ForNode(Location loc, std::string varName, std::unique_ptr< ASTNode > lowerBound, std::unique_ptr< ASTNode > upperBound, std::unique_ptr< ASTNode > step, std::vector< std::unique_ptr< ASTNode > > body)
Definition ast.h:237
const std::vector< std::unique_ptr< ASTNode > > & body() const
Definition ast.h:246
const std::string & varName() const
Definition ast.h:242
ASTNode * lowerBound() const
Definition ast.h:243
const std::optional< std::string > & returnType() const
Definition ast.h:70
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:72
std::string toString() const override
Definition ast.cpp:69
auto body() const
Definition ast.h:69
void setReturnType(std::string returnType)
Definition ast.h:78
const std::string & name() const
Definition ast.h:67
void addBodyStatement(std::unique_ptr< ASTNode > statement)
Definition ast.h:76
IfNode(Location loc, std::unique_ptr< ASTNode > condition, std::vector< std::unique_ptr< ASTNode > > body, std::vector< std::unique_ptr< ASTNode > > elseBody={})
Definition ast.h:216
auto body() const
Definition ast.h:221
std::string toString() const override
Definition ast.cpp:127
auto elseBody() const
Definition ast.h:222
ASTNode * condition() const
Definition ast.h:220
const std::vector< std::vector< double > > & rows() const
Definition ast.h:181
void addRow(const std::vector< double > &row)
Definition ast.h:183
KernelNode(Location loc)
Definition ast.h:180
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:127
std::string toString() const override
Definition ast.cpp:90
double value() const
Definition ast.h:129
std::string toString() const override
Definition ast.cpp:160
ReturnNode(Location loc, std::unique_ptr< ASTNode > returnValue)
Definition ast.h:263
ASTNode * returnValue() const
Definition ast.h:265
StringNode(Location loc, std::string value)
Definition ast.h:112
std::string toString() const override
Definition ast.cpp:88
const std::string & value() const
Definition ast.h:114
AST node for variable references.
Definition ast.h:92
const std::string & name() const
Definition ast.h:97
VariableNode(Location loc, std::string name, std::string type="unspecified")
Definition ast.h:94
const std::string & type() const
Definition ast.h:98
std::string toString() const override
Definition ast.cpp:86
Definition ast.h:11
auto getRawPointers(const std::vector< std::unique_ptr< T > > &vec)
Definition ast.h:13