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; }
71 void addParameter(
const std::string ¶mName,
const std::string ¶mType) {
72 _parameters.emplace_back(paramName, paramType);
75 void addBodyStatement(std::unique_ptr<ASTNode> statement) { _body.push_back(std::move(statement)); }
77 std::string
toString()
const override;
81 std::vector<std::pair<std::string, std::string>> _parameters;
82 std::vector<std::unique_ptr<ASTNode>> _body;
93 const std::string &
name()
const {
return _name; }
94 const std::optional<std::string> &
type()
const {
return _type; }
96 std::string
toString()
const override;
100 std::optional<std::string> _type;
110 const std::string &
value()
const {
return _value; }
112 std::string
toString()
const override;
125 double value()
const {
return _value; }
127 std::string
toString()
const override;
139 :
ASTNode(loc), _lhs(std::move(
lhs)), _rhs(std::move(
rhs)) {}
144 std::string
toString()
const override;
147 std::unique_ptr<VariableNode> _lhs;
148 std::unique_ptr<ASTNode> _rhs;
158 const std::string &
callee()
const {
return _callee; }
161 void addArgument(std::unique_ptr<ASTNode> arg) { _arguments.push_back(std::move(arg)); }
163 std::string
toString()
const override;
167 std::vector<std::unique_ptr<ASTNode>> _arguments;
177 const std::vector<std::vector<double>> &
rows()
const {
return _rows; }
179 void addRow(
const std::vector<double> &row) { _rows.push_back(row); }
181 std::string
toString()
const override;
184 std::vector<std::vector<double>> _rows;
193 :
ASTNode(loc), _op(std::move(
op)), _lhs(std::move(
lhs)), _rhs(std::move(
rhs)) {}
195 const std::string &
op()
const {
return _op; }
199 std::string
toString()
const override;
203 std::unique_ptr<ASTNode> _lhs;
204 std::unique_ptr<ASTNode> _rhs;
218 std::string
toString()
const override;
221 std::unique_ptr<ASTNode> _condition;
222 std::vector<std::unique_ptr<ASTNode>> _body;
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 ¶mName, const std::string ¶mType)
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
auto getRawPointers(const std::vector< std::unique_ptr< T > > &vec)
Definition ast.h:13