22using Ptr = fe::Arena::Ptr<const T>;
24using Ptrs = std::deque<Ptr<T>>;
25 using Dbgs = std::deque<Dbg>;
29 :
sym{sym_plugin, sym_tag}
30 ,
id{id_plugin, id_tag, 0, 0} {
42 std::deque<std::deque<Sym>>
subs;
44 std::optional<bool>
pi;
70 Sym
sym(std::string_view s) {
return driver().sym(s); }
71 Sym
sym(
const std::string& s) {
return driver().sym(s); }
77 template<
class T,
class... Args>
78 auto ptr(Args&&... args) {
79 return arena_.mk<
const T>(std::forward<Args>(args)...);
85 template<
class... Args>
Error&
error(Loc loc,
const char*
fmt, Args&&... args)
const {
return err_.
error(loc,
fmt, std::forward<Args>(args)...); }
86 template<
class... Args>
Error&
warn (Loc loc,
const char*
fmt, Args&&... args)
const {
return err_.
warn (loc,
fmt, std::forward<Args>(args)...); }
87 template<
class... Args>
Error&
note (Loc loc,
const char*
fmt, Args&&... args)
const {
return err_.
note (loc,
fmt, std::forward<Args>(args)...); }
97 void bootstrap(Sym plugin, std::ostream& h);
102 swap(a1.world_, a2.world_);
103 swap(a1.arena_, a2.arena_);
104 swap(a1.err_, a2.err_);
109 World* world_ =
nullptr;
112 absl::node_hash_map<fe::Sym, absl::node_hash_map<fe::Sym, AnnexInfo>> plugin2sym2annex_;
115class Node :
public fe::RuntimeCast<Node> {
122 Loc
loc()
const {
return loc_; }
124 virtual std::ostream&
stream(
Tab&, std::ostream&)
const = 0;
197 virtual void bind(
Scopes&,
bool rebind,
bool quiet)
const = 0;
210 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
213 std::ostream&
stream(
Tab&, std::ostream&)
const override;
236 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
239 std::ostream&
stream(
Tab&, std::ostream&)
const override;
257 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
260 std::ostream&
stream(
Tab&, std::ostream&)
const override;
279 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
282 std::ostream&
stream(
Tab&, std::ostream&)
const override;
301 bool is_implicit()
const override {
return delim_l_ == Tok::Tag::D_brace_l; }
303 const auto&
ptrns()
const {
return ptrns_; }
304 const Ptrn*
ptrn(
size_t i)
const {
return ptrns_[i].get(); }
307 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
312 std::ostream&
stream(
Tab&, std::ostream&)
const override;
329 std::ostream&
stream(
Tab&, std::ostream&)
const override;
341 std::ostream&
stream(
Tab&, std::ostream&)
const override;
358 std::ostream&
stream(
Tab&, std::ostream&)
const override;
364 mutable const Decl* decl_ =
nullptr;
379 std::ostream&
stream(
Tab&, std::ostream&)
const override;
400 std::ostream&
stream(
Tab&, std::ostream&)
const override;
418 const auto&
decls()
const {
return decls_; }
423 std::ostream&
stream(
Tab&, std::ostream&)
const override;
443 std::ostream&
stream(
Tab&, std::ostream&)
const override;
460 const auto&
types()
const {
return types_; }
463 std::ostream&
stream(
Tab&, std::ostream&)
const override;
485 std::ostream&
stream(
Tab&, std::ostream&)
const override;
511 std::ostream&
stream(
Tab&, std::ostream&)
const override;
524 const auto&
arms()
const {
return arms_; }
525 const Arm*
arm(
size_t i)
const {
return arms_[i].get(); }
529 std::ostream&
stream(
Tab&, std::ostream&)
const override;
545 , dom_(
std::move(dom))
546 , codom_(
std::move(codom)) {}
549 const Expr* dom()
const {
return dom_.get(); }
550 const Expr* codom()
const {
return codom_.get(); }
552 void bind(Scopes&)
const override;
553 const Def*
emit_decl(Emitter&,
const Def* type)
const override;
554 void emit_body(Emitter&,
const Def* decl)
const override;
555 std::ostream&
stream(Tab&, std::ostream&)
const override;
558 const Def*
emit_(Emitter&)
const override;
562 mutable Pi* decl_ =
nullptr;
582 auto loc = type->loc();
586 virtual void bind(
Scopes&,
bool quiet =
false)
const;
588 std::ostream&
stream(
Tab&, std::ostream&)
const override;
604 , dom_(
std::move(dom))
605 , codom_(
std::move(codom)) {}
608 Tok::Tag tag()
const {
return tag_; }
609 const Dom* dom()
const {
return dom_.get(); }
610 const Expr* codom()
const {
return codom_.get(); }
612 void bind(Scopes&)
const override;
613 const Def*
emit_decl(Emitter&,
const Def* type)
const override;
614 void emit_body(Emitter&,
const Def* decl)
const override;
615 std::ostream&
stream(Tab&, std::ostream&)
const override;
618 const Def*
emit_(Emitter&)
const override;
635 std::ostream&
stream(
Tab&, std::ostream&)
const override;
654 const Expr*
arg()
const {
return arg_.get(); }
657 std::ostream&
stream(
Tab&, std::ostream&)
const override;
679 const Expr*
arg()
const {
return arg_.get(); }
683 std::ostream&
stream(
Tab&, std::ostream&)
const override;
707 std::ostream&
stream(
Tab&, std::ostream&)
const override;
724 const auto&
elems()
const {
return elems_; }
725 const Expr*
elem(
size_t i)
const {
return elems_[i].get(); }
729 std::ostream&
stream(
Tab&, std::ostream&)
const override;
751 std::ostream&
stream(
Tab&, std::ostream&)
const override;
774 const auto&
index()
const {
return index_; }
778 std::ostream&
stream(
Tab&, std::ostream&)
const override;
784 std::variant<Ptr<Expr>,
Dbg> index_;
785 mutable const Decl* decl_ =
nullptr;
802 std::ostream&
stream(
Tab&, std::ostream&)
const override;
817 , inhabitant_(
std::move(expr)) {}
822 std::ostream&
stream(
Tab&, std::ostream&)
const override;
847 std::ostream&
stream(
Tab&, std::ostream&)
const override;
853 mutable sub_t sub_ = 0;
868 std::ostream&
stream(
Tab&, std::ostream&)
const override;
887 const auto&
subs()
const {
return subs_; }
889 const auto&
sub(
size_t i)
const {
return subs_[i]; }
897 std::ostream&
stream(
Tab&, std::ostream&)
const override;
901 std::deque<Ptrs<Alias>> subs_;
905 mutable sub_t offset_;
907 mutable const Def* mim_type_;
933 std::ostream&
stream(
Tab&, std::ostream&)
const override;
941 mutable sub_t sub_ = 0;
962 void bind(
Scopes&,
bool quiet =
false)
const override;
964 std::ostream&
stream(
Tab&, std::ostream&)
const override;
992 const Dom*
dom(
size_t i)
const {
return doms_[i].get(); }
1000 std::ostream&
stream(
Tab&, std::ostream&)
const override;
1008 mutable sub_t sub_ = 0;
1028 std::ostream&
stream(
Tab&, std::ostream&)
const override;
1055 std::ostream&
stream(
Tab&, std::ostream&)
const;
1059 swap(i1.dbg_, i2.dbg_);
1060 swap(i1.tag_, i2.tag_);
1061 swap(i1.module_, i2.module_);
1079 const auto&
decls()
const {
return decls_; }
1088 std::ostream&
stream(
Tab&, std::ostream&)
const override;
Some "global" variables needed all over the place.
Error & error(Loc loc, const char *s, Args &&... args)
Error & note(Loc loc, const char *s, Args &&... args)
Error & warn(Loc loc, const char *s, Args &&... args)
Keeps track of indentation level.
This is a thin wrapper for absl::InlinedVector<T, N, A> which is a drop-in replacement for std::vecto...
The World represents the whole program and manages creation of MimIR nodes (Defs).
const Driver & driver() const
friend void swap(AST &a1, AST &a2) noexcept
auto ptr(Args &&... args)
Error & error(Loc loc, const char *fmt, Args &&... args) const
AnnexInfo * name2annex(Dbg dbg, sub_t *)
Sym sym(std::string_view s)
const auto & plugin2annexes(Sym plugin)
void bootstrap(Sym plugin, std::ostream &h)
const Error & error() const
Sym sym_return()
"return".
Error & note(Loc loc, const char *fmt, Args &&... args) const
Error & warn(Loc loc, const char *fmt, Args &&... args) const
Sym sym_error()
"_error_".
Sym sym(const std::string &s)
const Def * emit_value(Emitter &, const Def *) const override
const Def * emit_type(Emitter &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Ptrn * ptrn() const
bool is_implicit() const override
AliasPtrn(Loc loc, Ptr< Ptrn > &&ptrn, Dbg dbg)
void bind(Scopes &, bool rebind, bool quiet) const override
AppExpr(Loc loc, bool is_explicit, Ptr< Expr > &&callee, Ptr< Expr > &&arg)
void bind(Scopes &) const override
const Def * emit_(Emitter &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * callee() const
void emit_body(Emitter &, const Def *decl) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_decl(Emitter &, const Def *type) const override
void bind(Scopes &) const override
ArrowExpr(Loc loc, Ptr< Expr > &&dom, Ptr< Expr > &&codom)
const Def * emit_(Emitter &) const override
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &, const AxmDecl *) const
void emit(Emitter &) const override
const auto & subs() const
const Expr * type() const
AxmDecl(Loc loc, Dbg dbg, std::deque< Ptrs< Alias > > &&subs, Ptr< Expr > &&type, Dbg normalizer, Tok curry, Tok trip)
void bind(Scopes &) const override
const auto & sub(size_t i) const
std::ostream & stream(Tab &, std::ostream &) const override
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
void emit(Emitter &) const override
const Expr * codom() const
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &) const override
const Expr * expr() const
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const auto & decls() const
void bind(Scopes &) const override
DeclExpr(Loc loc, Ptrs< ValDecl > &&decls, Ptr< Expr > &&expr, bool is_where)
void bind(Scopes &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const Def * emit_type(Emitter &) const override
const Def * emit_value(Emitter &, const Def *) const override
void bind(Scopes &, bool rebind, bool quiet) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit(Emitter &) const
virtual void emit_body(Emitter &, const Def *) const
virtual void bind(Scopes &) const =0
virtual const Def * emit_(Emitter &) const =0
virtual const Def * emit_decl(Emitter &, const Def *) const
static constexpr bool is_rassoc(Prec p)
const Def * emit_type(Emitter &) const override
GrpPtrn(Dbg dbg, const IdPtrn *id)
void bind(Scopes &, bool rebind, bool quiet) const override
const Def * emit_value(Emitter &, const Def *) const override
const IdPtrn * id() const
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &) const override
const Def * emit_(Emitter &) const override
const Def * emit_(Emitter &) const override
void bind(Scopes &) const override
const Decl * decl() const
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_type(Emitter &) const override
void bind(Scopes &, bool rebind, bool quiet) const override
static Ptr< IdPtrn > make_type(AST &ast, Ptr< Expr > &&type)
IdPtrn(Loc loc, Dbg dbg, Ptr< Expr > &&type)
static Ptr< IdPtrn > make_id(AST &ast, Dbg dbg, Ptr< Expr > &&type)
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_value(Emitter &, const Def *) const override
const Expr * type() const
friend void swap(Import &i1, Import &i2) noexcept
Import(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Module > &&module)
void bind(Scopes &) const
void emit(Emitter &) const
const Module * module() const
std::ostream & stream(Tab &, std::ostream &) const
const Def * emit_(Emitter &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * type() const
InjExpr(Loc loc, Ptr< Expr > &&value, Ptr< Expr > &&type)
void bind(Scopes &) const override
const Expr * value() const
InsertExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index, Ptr< Expr > &&value)
const Expr * index() const
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &) const override
const Expr * tuple() const
const Def * emit_(Emitter &) const override
const Expr * value() const
Lam * emit_value(Emitter &) const
const Expr * filter() const
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &, bool quiet=false) const override
Dom(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&filter)
void bind_body(Scopes &) const override
const Ptrs< Dom > & doms() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * codom() const
void emit_decl(Emitter &) const override
void emit_body(Emitter &) const override
void bind_decl(Scopes &) const override
LamDecl(Loc loc, Tok::Tag tag, bool is_external, Dbg dbg, Ptrs< Dom > &&doms, Ptr< Expr > &&codom, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
const Dom * dom(size_t i) const
void bind(Scopes &) const override
void emit_body(Emitter &, const Def *decl) const override
const Def * emit_(Emitter &) const override
LamExpr(Ptr< LamDecl > &&lam)
const LamDecl * lam() const
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_decl(Emitter &, const Def *type) const override
void bind(Scopes &) const override
const Expr * value() const
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
LetDecl(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&value)
void emit(Emitter &) const override
const Expr * type() const
const Def * emit_(Emitter &) const override
LitExpr(Loc loc, Tok tok, Ptr< Expr > &&type)
void bind(Scopes &) const override
std::ostream & stream(Tab &, std::ostream &) const override
Lam * emit(Emitter &) const
Arm(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&body)
const Expr * body() const
virtual void bind(Scopes &) const
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
MatchExpr(Loc loc, Ptr< Expr > &&scrutinee, Ptrs< Arm > &&arms)
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &) const override
const Def * emit_(Emitter &) const override
const Expr * scrutinee() const
const Arm * arm(size_t i) const
const auto & arms() const
Module(Loc loc, Ptrs< Import > &&imports, Ptrs< ValDecl > &&decls)
const auto & decls() const
const auto & implicit_imports() const
const auto & imports() const
void compile(AST &) const
void add_implicit_imports(Ptrs< Import > &&imports) const
std::ostream & stream(Tab &, std::ostream &) const override
virtual std::ostream & stream(Tab &, std::ostream &) const =0
virtual void emit_type(Emitter &) const
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
std::ostream & stream(Tab &, std::ostream &) const override
virtual void bind(Scopes &, bool quiet=false) const
const IdPtrn * ret() const
const Ptrn * ptrn() const
void add_ret(AST &ast, Ptr< Expr > &&type) const
const Def * emit_(Emitter &) const override
PiExpr(Loc loc, Tok::Tag tag, Ptr< Dom > &&dom, Ptr< Expr > &&codom)
const Def * emit_decl(Emitter &, const Def *type) const override
void bind(Scopes &) const override
std::ostream & stream(Tab &, std::ostream &) const override
void emit_body(Emitter &, const Def *decl) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
void bind(Scopes &) const override
PrimaryExpr(Loc loc, Tok::Tag tag)
virtual void bind(Scopes &, bool rebind, bool quiet) const =0
static Ptr< Ptrn > to_ptrn(Ptr< Expr > &&)
static Ptr< Expr > to_expr(AST &, Ptr< Ptrn > &&)
virtual const Def * emit_value(Emitter &, const Def *) const =0
virtual const Def * emit_type(Emitter &) const =0
virtual bool is_implicit() const
void emit(Emitter &) const override
virtual void emit_body(Emitter &) const
virtual void bind_body(Scopes &) const
virtual void emit_decl(Emitter &) const
RecDecl(Loc loc, Dbg dbg, Ptr< Expr > &&type, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
virtual void bind_decl(Scopes &) const
const Expr * body() const
const Expr * type() const
const RecDecl * next() const
void bind(Scopes &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Ptrn * ptrn() const
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
void bind(Scopes &) const override
const Def * emit_(Emitter &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * body() const
const Expr * callee() const
const Expr * body() const
const IdPtrn * arity() const
SeqExpr(Loc loc, bool is_arr, Ptr< IdPtrn > &&arity, Ptr< Expr > &&body)
void bind(Scopes &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const TuplePtrn * ptrn() const
const Def * emit_(Emitter &) const override
std::ostream & stream(Tab &, std::ostream &) const override
void emit_body(Emitter &, const Def *decl) const override
const Def * emit_decl(Emitter &, const Def *type) const override
SigmaExpr(Ptr< TuplePtrn > &&ptrn)
void bind(Scopes &) const override
static constexpr Tok::Tag delim_l2r(Tag tag)
const Expr * elem(size_t i) const
void bind(Scopes &) const override
TupleExpr(Loc loc, Ptrs< Expr > &&elems)
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const auto & elems() const
(ptrn_0, ..., ptrn_n-1), [ptrn_0, ..., ptrn_n-1], or {ptrn_0, ..., ptrn_n-1}
bool is_implicit() const override
void bind(Scopes &, bool rebind, bool quiet) const override
const Ptrn * ptrn(size_t i) const
const Def * emit_type(Emitter &) const override
const Def * emit_decl(Emitter &, const Def *type) const
const auto & ptrns() const
TuplePtrn(Loc loc, Tok::Tag delim_l, Ptrs< Ptrn > &&ptrns)
const Def * emit_value(Emitter &, const Def *) const override
const Def * emit_body(Emitter &, const Def *decl) const
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const Expr * level() const
TypeExpr(Loc loc, Ptr< Expr > &&level)
std::ostream & stream(Tab &, std::ostream &) const override
void bind(Scopes &) const override
UnionExpr(Loc loc, Ptrs< Expr > &&types)
void bind(Scopes &) const override
const auto & types() const
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const Expr * inhabitant() const
const Def * emit_(Emitter &) const override
void bind(Scopes &) const override
std::ostream & stream(Tab &, std::ostream &) const override
UniqExpr(Loc loc, Ptr< Expr > &&expr)
virtual void bind(Scopes &) const =0
virtual void emit(Emitter &) const =0
fe::Arena::Ptr< const T > Ptr
AST load_plugins(World &, View< Sym >)
std::deque< Ptr< T > > Ptrs
std::string fmt(const char *s, Args &&... args)
Wraps mim::print to output a formatted std:string.
static std::optional< plugin_t > mangle(Sym plugin)
Mangles s into a dense 48-bit representation.
std::deque< std::deque< Sym > > subs
List of subs which is a list of aliases.
struct mim::ast::AnnexInfo::@112046103026102051147230017206327014033073201371 sym
struct mim::ast::AnnexInfo::@177100250272201136376142224053244231100060214216 id
AnnexInfo(Sym sym_plugin, Sym sym_tag, plugin_t id_plugin, tag_t id_tag)