20#ifndef LLVMEXPR_FRONTEND_INFIX2POSTFIX_AST_HPP
21#define LLVMEXPR_FRONTEND_INFIX2POSTFIX_AST_HPP
67 std::unique_ptr<Expr>
left;
76 std::unique_ptr<Expr>
cond;
81 TernaryExpr(std::unique_ptr<Expr> c, std::unique_ptr<Expr> t,
82 std::unique_ptr<Expr> f);
87 std::vector<std::unique_ptr<Expr>>
args;
93 CallExpr(
Token callee_token, std::vector<std::unique_ptr<Expr>> a);
139 explicit ExprStmt(std::unique_ptr<Expr> e);
163 explicit BlockStmt(std::vector<std::unique_ptr<Stmt>> s);
172 IfStmt(std::unique_ptr<Expr> c, std::unique_ptr<Stmt> t,
173 std::unique_ptr<Stmt> e);
181 WhileStmt(std::unique_ptr<Expr> c, std::unique_ptr<Stmt> b);
230 std::unique_ptr<BlockStmt>
body;
235 FunctionDef(
Token n, std::vector<Parameter> p, std::unique_ptr<BlockStmt> b,
236 std::unique_ptr<GlobalDecl> g);
247 template <
typename T>
explicit Expr(T&& v) :
value(std::forward<T>(v)) {}
256 return std::visit([](
const auto& e) {
return e.range; },
value);
267 template <
typename T>
explicit Stmt(T&& v) :
value(std::forward<T>(v)) {}
276 return std::visit([](
const auto& s) {
return s.range; },
value);
281 std::unique_ptr<Expr> plane)
286 :
op(std::move(o)),
right(std::move(r)) {
292 std::unique_ptr<Expr> r)
293 :
left(std::move(l)),
op(std::move(o)),
right(std::move(r)) {
299 std::unique_ptr<Expr> t,
300 std::unique_ptr<Expr> f)
315 std::vector<std::unique_ptr<Expr>> a)
316 :
callee(std::move(callee_token.value)),
args(std::move(a)),
326 :
name(std::move(n)),
value(std::move(v)) {
334 range.start = statements.front()->range().start;
335 range.end = statements.back()->range().end;
340 std::unique_ptr<Stmt> e)
380 std::unique_ptr<BlockStmt> b,
381 std::unique_ptr<GlobalDecl> g)
389 std::unique_ptr<Expr> idx)
390 :
array(std::move(arr)),
index(std::move(idx)) {
402 std::unique_ptr<Expr> v)
420template <
class T,
class... Types>
422 : std::disjunction<std::is_same<T, Types>...> {};
424template <
class T,
class V>
430 "T must be a member of either ExprVariant or StmtVariant");
431 using type = std::conditional_t<IS_VARIANT_MEMBER_V<T, Expr::ExprVariant>,
437template <
typename T,
typename... Args>
auto make_node(Args&&... args) {
438 return std::make_unique<node_wrapper_t<T>>(T(std::forward<Args>(args)...));
441template <
typename T,
typename Wrapper>
442auto get_if(Wrapper* wrapper) ->
decltype(std::get_if<T>(&wrapper->value)) {
446 return std::get_if<T>(&wrapper->value);
auto get_if(Wrapper *wrapper) -> decltype(std::get_if< T >(&wrapper->value))
typename NodeWrapper< T >::type node_wrapper_t
constexpr bool IS_VARIANT_MEMBER_V
auto make_node(Args &&... args)
std::unique_ptr< Expr > index
ArrayAccessExpr(std::unique_ptr< Expr > arr, std::unique_ptr< Expr > idx)
std::unique_ptr< Expr > array
std::shared_ptr< Symbol > array_symbol
ArrayAssignStmt(std::unique_ptr< Expr > t, std::unique_ptr< Expr > v)
std::unique_ptr< Expr > value
std::unique_ptr< Expr > target
std::shared_ptr< Symbol > symbol
std::unique_ptr< Expr > value
AssignStmt(Token n, std::unique_ptr< Expr > v)
BinaryExpr(std::unique_ptr< Expr > l, Token o, std::unique_ptr< Expr > r)
std::unique_ptr< Expr > right
std::unique_ptr< Expr > left
std::vector< std::unique_ptr< Stmt > > statements
BlockStmt(std::vector< std::unique_ptr< Stmt > > s)
std::vector< std::unique_ptr< Expr > > args
const FunctionSignature * resolved_signature
CallExpr(Token callee_token, std::vector< std::unique_ptr< Expr > > a)
const BuiltinFunction * resolved_builtin
FunctionDef * resolved_def
std::unique_ptr< Expr > expr
ExprStmt(std::unique_ptr< Expr > e)
Expr & operator=(Expr &&)=default
std::variant< NumberExpr, VariableExpr, UnaryExpr, BinaryExpr, TernaryExpr, CallExpr, PropAccessExpr, StaticRelPixelAccessExpr, FrameDimensionExpr, ArrayAccessExpr > ExprVariant
Expr(const Expr &)=delete
Expr & operator=(const Expr &)=delete
FrameDimensionExpr(Token keyword, std::unique_ptr< Expr > plane)
std::string dimension_name
std::unique_ptr< Expr > plane_index_expr
std::vector< Parameter > params
std::unique_ptr< BlockStmt > body
FunctionDef(Token n, std::vector< Parameter > p, std::unique_ptr< BlockStmt > b, std::unique_ptr< GlobalDecl > g)
std::unique_ptr< GlobalDecl > global_decl
std::shared_ptr< Symbol > symbol
std::vector< Token > globals
GlobalDecl(Token t, GlobalMode m, std::vector< Token > g={})
GotoStmt(Token kw, Token l, std::unique_ptr< Expr > c)
std::unique_ptr< Expr > condition
std::shared_ptr< Symbol > target_label_symbol
std::unique_ptr< Expr > condition
std::unique_ptr< Stmt > then_branch
IfStmt(std::unique_ptr< Expr > c, std::unique_ptr< Stmt > t, std::unique_ptr< Stmt > e)
std::unique_ptr< Stmt > else_branch
std::shared_ptr< Symbol > symbol
std::conditional_t< IS_VARIANT_MEMBER_V< T, Expr::ExprVariant >, Expr, Stmt > type
std::vector< std::unique_ptr< Stmt > > statements
PropAccessExpr(Token c, Token p)
std::unique_ptr< Expr > value
ReturnStmt(Token kw, std::unique_ptr< Expr > v)
std::string boundary_suffix
StaticRelPixelAccessExpr(Token c, Token x, Token y, std::string suffix)
Stmt & operator=(const Stmt &)=delete
Stmt & operator=(Stmt &&)=default
Stmt(const Stmt &)=delete
std::variant< ExprStmt, AssignStmt, BlockStmt, IfStmt, WhileStmt, ReturnStmt, LabelStmt, GotoStmt, FunctionDef, GlobalDecl, ArrayAssignStmt > StmtVariant
TernaryExpr(std::unique_ptr< Expr > c, std::unique_ptr< Expr > t, std::unique_ptr< Expr > f)
std::unique_ptr< Expr > cond
std::unique_ptr< Expr > true_expr
std::unique_ptr< Expr > false_expr
std::unique_ptr< Expr > right
UnaryExpr(Token o, std::unique_ptr< Expr > r)
std::shared_ptr< Symbol > symbol
std::unique_ptr< Stmt > body
std::unique_ptr< Expr > condition
WhileStmt(std::unique_ptr< Expr > c, std::unique_ptr< Stmt > b)