23 namespace aul {
namespace ast {
63 virtual void visit(const ::aul::ast::Noop *) {}
64 virtual void visit(const ::aul::ast::StringLit *) {}
65 virtual void visit(const ::aul::ast::IntLit *) {}
66 virtual void visit(const ::aul::ast::BoolLit *) {}
67 virtual void visit(const ::aul::ast::ArrayLit *) {}
68 virtual void visit(const ::aul::ast::ProplistLit *) {}
69 virtual void visit(const ::aul::ast::NilLit *) {}
70 virtual void visit(const ::aul::ast::ThisLit *) {}
71 virtual void visit(const ::aul::ast::VarExpr *n) {}
72 virtual void visit(const ::aul::ast::UnOpExpr *) {}
73 virtual void visit(const ::aul::ast::BinOpExpr *) {}
74 virtual void visit(const ::aul::ast::AssignmentExpr *) {}
75 virtual void visit(const ::aul::ast::SubscriptExpr *) {}
76 virtual void visit(const ::aul::ast::SliceExpr *) {}
77 virtual void visit(const ::aul::ast::CallExpr *) {}
78 virtual void visit(const ::aul::ast::ParExpr *) {}
79 virtual void visit(const ::aul::ast::Block *) {}
80 virtual void visit(const ::aul::ast::Return *) {}
81 virtual void visit(const ::aul::ast::ForLoop *) {}
82 virtual void visit(const ::aul::ast::RangeLoop *) {}
83 virtual void visit(const ::aul::ast::DoLoop *) {}
84 virtual void visit(const ::aul::ast::WhileLoop *) {}
85 virtual void visit(const ::aul::ast::Break *) {}
86 virtual void visit(const ::aul::ast::Continue *) {}
87 virtual void visit(const ::aul::ast::If *) {}
88 virtual void visit(const ::aul::ast::VarDecl *) {}
89 virtual void visit(const ::aul::ast::FunctionDecl *) {}
90 virtual void visit(const ::aul::ast::FunctionExpr *) {}
91 virtual void visit(const ::aul::ast::IncludePragma *) {}
92 virtual void visit(const ::aul::ast::AppendtoPragma *) {}
93 virtual void visit(const ::aul::ast::Script *) {}
103 namespace aul {
namespace ast {
105 #define AST_NODE(cls) \
107 virtual void accept(::aul::AstVisitor *v) const override { v->visit(this); } \
108 template<class... T> static std::unique_ptr<cls> New(const char *loc, T &&...t) { auto n = std::make_unique<cls>(std::forward<T>(t)...); n->loc = loc; return n; } \
123 const char *
loc =
nullptr;
187 std::vector<std::pair<std::string, ExprPtr>>
values;
441 void visit(const ::aul::ast::ArrayLit *n)
override
443 for (
const auto &c : n->values)
446 void visit(const ::aul::ast::ProplistLit *n)
override
448 for (
const auto &c : n->values)
449 c.second->accept(
this);
451 void visit(const ::aul::ast::UnOpExpr *n)
override
453 n->operand->accept(
this);
455 void visit(const ::aul::ast::BinOpExpr *n)
override
457 n->lhs->accept(
this);
458 n->rhs->accept(
this);
460 void visit(const ::aul::ast::AssignmentExpr *n)
override
462 n->lhs->accept(
this);
463 n->rhs->accept(
this);
465 void visit(const ::aul::ast::SubscriptExpr *n)
override
467 n->object->accept(
this);
468 n->index->accept(
this);
470 void visit(const ::aul::ast::SliceExpr *n)
override
472 n->object->accept(
this);
473 n->start->accept(
this);
474 n->end->accept(
this);
476 void visit(const ::aul::ast::CallExpr *n)
override
479 n->context->accept(
this);
480 for (
const auto &
a : n->args)
483 void visit(const ::aul::ast::ParExpr *n)
override
485 n->arg->accept(
this);
487 void visit(const ::aul::ast::Block *n)
override
489 for (
const auto &
s : n->children)
492 void visit(const ::aul::ast::Return *n)
override
494 n->value->accept(
this);
496 void visit(const ::aul::ast::ForLoop *n)
override
499 n->init->accept(
this);
501 n->cond->accept(
this);
503 n->incr->accept(
this);
504 n->body->accept(
this);
506 void visit(const ::aul::ast::RangeLoop *n)
override
508 n->cond->accept(
this);
509 n->body->accept(
this);
511 void visit(const ::aul::ast::DoLoop *n)
override
513 n->body->accept(
this);
514 n->cond->accept(
this);
516 void visit(const ::aul::ast::WhileLoop *n)
override
518 n->cond->accept(
this);
519 n->body->accept(
this);
521 void visit(const ::aul::ast::If *n)
override
523 n->cond->accept(
this);
524 n->iftrue->accept(
this);
526 n->iffalse->accept(
this);
528 void visit(const ::aul::ast::VarDecl *n)
override
530 for (
const auto &d : n->decls)
532 d.init->accept(
this);
534 void visit(const ::aul::ast::FunctionDecl *n)
override
536 n->body->accept(
this);
538 void visit(const ::aul::ast::FunctionExpr *n)
override
540 n->body->accept(
this);
542 void visit(const ::aul::ast::Script *n)
override
544 for (
const auto &d : n->declarations)
virtual void visit(const ::aul::ast::Break *)
virtual void visit(const ::aul::ast::Script *)
virtual void visit(const ::aul::ast::FunctionExpr *)
virtual void visit(const ::aul::ast::UnOpExpr *)
virtual void visit(const ::aul::ast::BoolLit *)
virtual void visit(const ::aul::ast::SubscriptExpr *)
virtual void visit(const ::aul::ast::ForLoop *)
virtual void visit(const ::aul::ast::FunctionDecl *)
virtual void visit(const ::aul::ast::AppendtoPragma *)
virtual void visit(const ::aul::ast::ArrayLit *)
virtual void visit(const ::aul::ast::RangeLoop *)
virtual ~AstVisitor()=default
virtual void visit(const ::aul::ast::CallExpr *)
virtual void visit(const ::aul::ast::If *)
virtual void visit(const ::aul::ast::VarDecl *)
virtual void visit(const ::aul::ast::IncludePragma *)
virtual void visit(const ::aul::ast::SliceExpr *)
virtual void visit(const ::aul::ast::Return *)
virtual void visit(const ::aul::ast::ProplistLit *)
virtual void visit(const ::aul::ast::ThisLit *)
virtual void visit(const ::aul::ast::ParExpr *)
virtual void visit(const ::aul::ast::Noop *)
virtual void visit(const ::aul::ast::AssignmentExpr *)
virtual void visit(const ::aul::ast::IntLit *)
virtual void visit(const ::aul::ast::NilLit *)
virtual void visit(const ::aul::ast::BinOpExpr *)
virtual void visit(const ::aul::ast::WhileLoop *)
virtual void visit(const ::aul::ast::DoLoop *)
void visit(const T *)=delete
virtual void visit(const ::aul::ast::Block *)
virtual void visit(const ::aul::ast::VarExpr *n)
virtual void visit(const ::aul::ast::Continue *)
virtual void visit(const ::aul::ast::StringLit *)
void visit(const ::aul::ast::ForLoop *n) override
void visit(const ::aul::ast::FunctionExpr *n) override
void visit(const ::aul::ast::ProplistLit *n) override
void visit(const ::aul::ast::ParExpr *n) override
void visit(const ::aul::ast::If *n) override
void visit(const ::aul::ast::Return *n) override
void visit(const ::aul::ast::AssignmentExpr *n) override
void visit(const ::aul::ast::WhileLoop *n) override
void visit(const ::aul::ast::RangeLoop *n) override
void visit(const ::aul::ast::Block *n) override
void visit(const ::aul::ast::DoLoop *n) override
void visit(const ::aul::ast::SubscriptExpr *n) override
void visit(const ::aul::ast::SliceExpr *n) override
void visit(const ::aul::ast::BinOpExpr *n) override
void visit(const ::aul::ast::CallExpr *n) override
void visit(const ::aul::ast::Script *n) override
~DefaultRecursiveVisitor() override=default
void visit(const ::aul::ast::VarDecl *n) override
void visit(const ::aul::ast::UnOpExpr *n) override
void visit(const ::aul::ast::ArrayLit *n) override
void visit(const ::aul::ast::FunctionDecl *n) override
AppendtoPragma(const std::string &what)
std::vector< ExprPtr > values
AssignmentExpr(ExprPtr &&lhs, ExprPtr &&rhs)
BinOpExpr(int op, ExprPtr &&lhs, ExprPtr &&rhs)
std::vector< StmtPtr > children
std::vector< ExprPtr > args
bool has_value() const override
FunctionDecl(const std::string &name)
std::vector< Parameter > params
virtual ~Function()=default
virtual void accept(::aul::AstVisitor *v) const =0
std::unique_ptr< Block > body
IncludePragma(const std::string &what)
virtual void accept(::aul::AstVisitor *) const =0
std::vector< std::pair< std::string, ExprPtr > > values
std::vector< DeclPtr > declarations
SliceExpr(ExprPtr &&object, ExprPtr &&start, ExprPtr &&end)
virtual bool has_value() const
StringLit(const std::string &value)
SubscriptExpr(ExprPtr &&object, ExprPtr &&index)
UnOpExpr(int op, ExprPtr &&operand)
VarExpr(const std::string &identifier)
std::unique_ptr< Decl > DeclPtr
std::unique_ptr< Loop > LoopPtr
std::unique_ptr< Expr > ExprPtr
std::unique_ptr< Stmt > StmtPtr
Parameter(const std::string &name, C4V_Type type=C4V_Any)