21template<
class T>
using Ptr = fe::Arena::Ptr<const T>;
22template<
class T>
using Ptrs = std::deque<Ptr<T>>;
23 using Dbgs = std::deque<Dbg>;
27 :
sym{sym_plugin, sym_tag}
28 ,
id{id_plugin, id_tag, 0, 0} {
40 std::deque<std::deque<Sym>>
subs;
42 std::optional<bool>
pi;
68 Sym
sym(std::string_view s) {
return driver().sym(s); }
69 Sym
sym(
const std::string& s) {
return driver().sym(s); }
75 template<
class T,
class... Args>
auto ptr(Args&&... args) {
76 return arena_.mk<
const T>(std::forward<Args&&>(args)...);
82 template<
class... Args>
Error&
error(Loc loc,
const char*
fmt, Args&&... args)
const {
return err_.
error(loc,
fmt, std::forward<Args&&>(args)...); }
83 template<
class... Args>
Error&
warn (Loc loc,
const char*
fmt, Args&&... args)
const {
return err_.
warn (loc,
fmt, std::forward<Args&&>(args)...); }
84 template<
class... Args>
Error&
note (Loc loc,
const char*
fmt, Args&&... args)
const {
return err_.
note (loc,
fmt, std::forward<Args&&>(args)...); }
94 void bootstrap(Sym plugin, std::ostream& h);
99 swap(a1.world_, a2.world_);
100 swap(a1.arena_, a2.arena_);
101 swap(a1.err_, a2.err_);
106 World* world_ =
nullptr;
109 absl::node_hash_map<fe::Sym, absl::node_hash_map<fe::Sym, AnnexInfo>> plugin2sym2annex_;
112class Node :
public fe::RuntimeCast<Node> {
119 Loc
loc()
const {
return loc_; }
121 virtual std::ostream&
stream(
Tab&, std::ostream&)
const = 0;
194 virtual void bind(
Scopes&,
bool rebind,
bool quiet)
const = 0;
207 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
210 std::ostream&
stream(
Tab&, std::ostream&)
const override;
233 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
236 std::ostream&
stream(
Tab&, std::ostream&)
const override;
254 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
257 std::ostream&
stream(
Tab&, std::ostream&)
const override;
276 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
279 std::ostream&
stream(
Tab&, std::ostream&)
const override;
298 bool is_implicit()
const override {
return delim_l_ == Tok::Tag::D_brace_l; }
300 const auto&
ptrns()
const {
return ptrns_; }
301 const Ptrn*
ptrn(
size_t i)
const {
return ptrns_[i].get(); }
304 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
309 std::ostream&
stream(
Tab&, std::ostream&)
const override;
326 std::ostream&
stream(
Tab&, std::ostream&)
const override;
338 std::ostream&
stream(
Tab&, std::ostream&)
const override;
355 std::ostream&
stream(
Tab&, std::ostream&)
const override;
361 mutable const Decl* decl_ =
nullptr;
376 std::ostream&
stream(
Tab&, std::ostream&)
const override;
397 std::ostream&
stream(
Tab&, std::ostream&)
const override;
415 const auto&
decls()
const {
return decls_; }
420 std::ostream&
stream(
Tab&, std::ostream&)
const override;
440 std::ostream&
stream(
Tab&, std::ostream&)
const override;
457 const auto&
types()
const {
return types_; }
460 std::ostream&
stream(
Tab&, std::ostream&)
const override;
482 std::ostream&
stream(
Tab&, std::ostream&)
const override;
508 std::ostream&
stream(
Tab&, std::ostream&)
const override;
521 const auto&
arms()
const {
return arms_; }
522 const Arm*
arm(
size_t i)
const {
return arms_[i].get(); }
526 std::ostream&
stream(
Tab&, std::ostream&)
const override;
542 , dom_(
std::move(dom))
543 , codom_(
std::move(codom)) {}
546 const Expr* dom()
const {
return dom_.get(); }
547 const Expr* codom()
const {
return codom_.get(); }
549 void bind(Scopes&)
const override;
550 const Def*
emit_decl(Emitter&,
const Def* type)
const override;
551 void emit_body(Emitter&,
const Def* decl)
const override;
552 std::ostream&
stream(Tab&, std::ostream&)
const override;
555 const Def*
emit_(Emitter&)
const override;
559 mutable Pi* decl_ =
nullptr;
579 auto loc = type->loc();
583 virtual void bind(
Scopes&,
bool quiet =
false)
const;
585 std::ostream&
stream(
Tab&, std::ostream&)
const override;
601 , dom_(
std::move(dom))
602 , codom_(
std::move(codom)) {}
605 Tok::Tag tag()
const {
return tag_; }
606 const Dom* dom()
const {
return dom_.get(); }
607 const Expr* codom()
const {
return codom_.get(); }
609 void bind(Scopes&)
const override;
610 const Def*
emit_decl(Emitter&,
const Def* type)
const override;
611 void emit_body(Emitter&,
const Def* decl)
const override;
612 std::ostream&
stream(Tab&, std::ostream&)
const override;
615 const Def*
emit_(Emitter&)
const override;
632 std::ostream&
stream(
Tab&, std::ostream&)
const override;
651 const Expr*
arg()
const {
return arg_.get(); }
654 std::ostream&
stream(
Tab&, std::ostream&)
const override;
676 const Expr*
arg()
const {
return arg_.get(); }
680 std::ostream&
stream(
Tab&, std::ostream&)
const override;
704 std::ostream&
stream(
Tab&, std::ostream&)
const override;
721 const auto&
elems()
const {
return elems_; }
722 const Expr*
elem(
size_t i)
const {
return elems_[i].get(); }
726 std::ostream&
stream(
Tab&, std::ostream&)
const override;
748 std::ostream&
stream(
Tab&, std::ostream&)
const override;
771 const auto&
index()
const {
return index_; }
775 std::ostream&
stream(
Tab&, std::ostream&)
const override;
781 std::variant<Ptr<Expr>,
Dbg> index_;
782 mutable const Decl* decl_ =
nullptr;
799 std::ostream&
stream(
Tab&, std::ostream&)
const override;
814 , inhabitant_(
std::move(expr)) {}
819 std::ostream&
stream(
Tab&, std::ostream&)
const override;
844 std::ostream&
stream(
Tab&, std::ostream&)
const override;
850 mutable sub_t sub_ = 0;
865 std::ostream&
stream(
Tab&, std::ostream&)
const override;
884 const auto&
subs()
const {
return subs_; }
886 const auto&
sub(
size_t i)
const {
return subs_[i]; }
894 std::ostream&
stream(
Tab&, std::ostream&)
const override;
898 std::deque<Ptrs<Alias>> subs_;
902 mutable sub_t offset_;
904 mutable const Def* mim_type_;
930 std::ostream&
stream(
Tab&, std::ostream&)
const override;
938 mutable sub_t sub_ = 0;
959 void bind(
Scopes&,
bool quiet =
false)
const override;
961 std::ostream&
stream(
Tab&, std::ostream&)
const override;
989 const Dom*
dom(
size_t i)
const {
return doms_[i].get(); }
997 std::ostream&
stream(
Tab&, std::ostream&)
const override;
1005 mutable sub_t sub_ = 0;
1025 std::ostream&
stream(
Tab&, std::ostream&)
const override;
1052 std::ostream&
stream(
Tab&, std::ostream&)
const;
1056 swap(i1.dbg_, i2.dbg_);
1057 swap(i1.tag_, i2.tag_);
1058 swap(i1.module_, i2.module_);
1076 const auto&
decls()
const {
return decls_; }
1085 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
void bind(Scopes &) const override
const IdPtrn * shape() const
std::ostream & stream(Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
SeqExpr(Loc loc, bool is_arr, Ptr< IdPtrn > &&shape, Ptr< Expr > &&body)
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)