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(); });
52 void addStatement(std::unique_ptr<ASTNode> statement) { _statements.push_back(std::move(statement)); }
54 std::string
toString()
const override;
57 std::vector<std::unique_ptr<ASTNode>> _statements;
67 const std::string &
name()
const {
return _name; }
70 const std::optional<std::string> &
returnType()
const {
return _returnType; }
72 void addParameter(
const std::string ¶mName,
const std::string ¶mType) {
73 _parameters.emplace_back(paramName, paramType);
76 void addBodyStatement(std::unique_ptr<ASTNode> statement) { _body.push_back(std::move(statement)); }
80 std::string
toString()
const override;
84 std::vector<std::pair<std::string, std::string>> _parameters;
85 std::vector<std::unique_ptr<ASTNode>> _body;
86 std::optional<std::string> _returnType;
97 const std::string &
name()
const {
return _name; }
98 const std::string &
type()
const {
return _type; }
100 std::string
toString()
const override;
114 const std::string &
value()
const {
return _value; }
116 std::string
toString()
const override;
129 double value()
const {
return _value; }
131 std::string
toString()
const override;
143 :
ASTNode(loc), _lhs(std::move(
lhs)), _rhs(std::move(
rhs)) {}
148 std::string
toString()
const override;
151 std::unique_ptr<VariableNode> _lhs;
152 std::unique_ptr<ASTNode> _rhs;
162 const std::string &
callee()
const {
return _callee; }
165 void addArgument(std::unique_ptr<ASTNode> arg) { _arguments.push_back(std::move(arg)); }
167 std::string
toString()
const override;
171 std::vector<std::unique_ptr<ASTNode>> _arguments;
181 const std::vector<std::vector<double>> &
rows()
const {
return _rows; }
183 void addRow(
const std::vector<double> &row) { _rows.push_back(row); }
185 std::string
toString()
const override;
188 std::vector<std::vector<double>> _rows;
197 :
ASTNode(loc), _op(std::move(
op)), _lhs(std::move(
lhs)), _rhs(std::move(
rhs)) {}
199 const std::string &
op()
const {
return _op; }
203 std::string
toString()
const override;
207 std::unique_ptr<ASTNode> _lhs;
208 std::unique_ptr<ASTNode> _rhs;
217 std::vector<std::unique_ptr<ASTNode>>
elseBody = {})
224 std::string
toString()
const override;
227 std::unique_ptr<ASTNode> _condition;
228 std::vector<std::unique_ptr<ASTNode>> _body;
229 std::vector<std::unique_ptr<ASTNode>> _elseBody;
238 std::unique_ptr<ASTNode>
step, std::vector<std::unique_ptr<ASTNode>>
body)
242 const std::string &
varName()
const {
return _varName; }
246 const std::vector<std::unique_ptr<ASTNode>> &
body()
const {
return _body; }
248 std::string
toString()
const override;
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;
267 std::string
toString()
const override;
270 std::unique_ptr<ASTNode> _returnValue;
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 ¶mName, const std::string ¶mType)
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
auto getRawPointers(const std::vector< std::unique_ptr< T > > &vec)
Definition ast.h:13