22using Ptr = fe::Arena::Ptr<const T>;
24using Ptrs = std::deque<Ptr<T>>;
25using Dbgs = std::deque<Dbg>;
29 :
sym{sym_plugin, sym_tag}
47 std::deque<std::deque<Sym>>
subs;
49 std::optional<bool>
pi;
76 Sym
sym(std::string_view s) {
return driver().sym(s); }
77 Sym
sym(
const std::string& s) {
return driver().sym(s); }
83 template<
class T,
class... Args>
84 auto ptr(Args&&... args) {
85 return arena_.mk<
const T>(std::forward<Args>(args)...);
91 template<
class... Args>
Error&
error(Loc loc, std::format_string<Args...> fmt, Args&&... args)
const {
return err_.
error(loc, fmt, std::forward<Args>(args)...); }
92 template<
class... Args>
Error&
warn (Loc loc, std::format_string<Args...> fmt, Args&&... args)
const {
return err_.
warn (loc, fmt, std::forward<Args>(args)...); }
93 template<
class... Args>
Error&
note (Loc loc, std::format_string<Args...> fmt, Args&&... args)
const {
return err_.
note (loc, fmt, std::forward<Args>(args)...); }
105 void bootstrap(Sym plugin, std::ostream& h);
112 swap(a1.world_, a2.world_);
113 swap(a1.arena_, a2.arena_);
114 swap(a1.err_, a2.err_);
119 World* world_ =
nullptr;
124 absl::node_hash_map<fe::Sym, absl::node_hash_map<fe::Sym, AnnexInfo>> plugin2sym2annex_;
127class Node :
public fe::RuntimeCast<Node> {
134 Loc
loc()
const {
return loc_; }
136 virtual void stream(fe::Tab&, std::ostream&)
const = 0;
193 virtual void bind(
Scopes&,
bool rebind,
bool quiet)
const = 0;
206 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
209 void stream(fe::Tab&, std::ostream&)
const override;
232 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
235 void stream(fe::Tab&, std::ostream&)
const override;
253 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
256 void stream(fe::Tab&, std::ostream&)
const override;
275 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
278 void stream(fe::Tab&, std::ostream&)
const override;
297 bool is_implicit()
const override {
return delim_l_ == Tok::Tag::D_brace_l; }
299 const auto&
ptrns()
const {
return ptrns_; }
300 const Ptrn*
ptrn(
size_t i)
const {
return ptrns_[i].get(); }
303 void bind(
Scopes&,
bool rebind,
bool quiet)
const override;
308 void stream(fe::Tab&, std::ostream&)
const override;
325 void stream(fe::Tab&, std::ostream&)
const override;
337 void stream(fe::Tab&, std::ostream&)
const override;
354 void stream(fe::Tab&, std::ostream&)
const override;
360 mutable const Decl* decl_ =
nullptr;
375 void stream(fe::Tab&, std::ostream&)
const override;
396 void stream(fe::Tab&, std::ostream&)
const override;
414 const auto&
decls()
const {
return decls_; }
419 void stream(fe::Tab&, std::ostream&)
const override;
439 void stream(fe::Tab&, std::ostream&)
const override;
454 const Expr*
dom()
const {
return dom_.get(); }
457 void stream(fe::Tab&, std::ostream&)
const override;
474 const auto&
types()
const {
return types_; }
477 void stream(fe::Tab&, std::ostream&)
const override;
499 void stream(fe::Tab&, std::ostream&)
const override;
525 void stream(fe::Tab&, std::ostream&)
const override;
538 const auto&
arms()
const {
return arms_; }
539 const Arm*
arm(
size_t i)
const {
return arms_[i].get(); }
543 void stream(fe::Tab&, std::ostream&)
const override;
559 , dom_(
std::move(dom))
560 , codom_(
std::move(codom)) {}
563 const Expr* dom()
const {
return dom_.get(); }
564 const Expr* codom()
const {
return codom_.get(); }
566 void bind(Scopes&)
const override;
567 const Def*
emit_decl(Emitter&,
const Def* type)
const override;
568 void emit_body(Emitter&,
const Def* decl)
const override;
569 void stream(fe::Tab&, std::ostream&)
const override;
572 const Def*
emit_(Emitter&)
const override;
576 mutable Pi* decl_ =
nullptr;
596 auto loc = type->loc();
600 virtual void bind(
Scopes&,
bool quiet =
false)
const;
602 void stream(fe::Tab&, std::ostream&)
const override;
618 , dom_(
std::move(dom))
619 , codom_(
std::move(codom)) {}
622 Tok::Tag tag()
const {
return tag_; }
623 const Dom* dom()
const {
return dom_.get(); }
624 const Expr* codom()
const {
return codom_.get(); }
626 void bind(Scopes&)
const override;
627 const Def*
emit_decl(Emitter&,
const Def* type)
const override;
628 void emit_body(Emitter&,
const Def* decl)
const override;
629 void stream(fe::Tab&, std::ostream&)
const override;
632 const Def*
emit_(Emitter&)
const override;
649 void stream(fe::Tab&, std::ostream&)
const override;
668 const Expr*
arg()
const {
return arg_.get(); }
671 void stream(fe::Tab&, std::ostream&)
const override;
693 const Expr*
arg()
const {
return arg_.get(); }
697 void stream(fe::Tab&, std::ostream&)
const override;
721 void stream(fe::Tab&, std::ostream&)
const override;
738 const auto&
elems()
const {
return elems_; }
739 const Expr*
elem(
size_t i)
const {
return elems_[i].get(); }
743 void stream(fe::Tab&, std::ostream&)
const override;
765 void stream(fe::Tab&, std::ostream&)
const override;
788 const auto&
index()
const {
return index_; }
792 void stream(fe::Tab&, std::ostream&)
const override;
798 std::variant<Ptr<Expr>,
Dbg> index_;
799 mutable const Decl* decl_ =
nullptr;
816 void stream(fe::Tab&, std::ostream&)
const override;
831 , inhabitant_(
std::move(expr)) {}
836 void stream(fe::Tab&, std::ostream&)
const override;
861 void stream(fe::Tab&, std::ostream&)
const override;
867 mutable sub_t sub_ = 0;
882 void stream(fe::Tab&, std::ostream&)
const override;
901 const auto&
subs()
const {
return subs_; }
903 const auto&
sub(
size_t i)
const {
return subs_[i]; }
911 void stream(fe::Tab&, std::ostream&)
const override;
915 std::deque<Ptrs<Alias>> subs_;
919 mutable sub_t offset_;
921 mutable const Def* mim_type_;
947 void stream(fe::Tab&, std::ostream&)
const override;
955 mutable sub_t sub_ = 0;
976 void bind(
Scopes&,
bool quiet =
false)
const override;
978 void stream(fe::Tab&, std::ostream&)
const override;
1006 const Dom*
dom(
size_t i)
const {
return doms_[i].get(); }
1014 void stream(fe::Tab&, std::ostream&)
const override;
1022 mutable sub_t sub_ = 0;
1042 void stream(fe::Tab&, std::ostream&)
const override;
1073 void stream(fe::Tab&, std::ostream&)
const override;
1083 bool is_normalizer_;
1101 void stream(fe::Tab&, std::ostream&)
const;
1105 swap(i1.dbg_, i2.dbg_);
1106 swap(i1.tag_, i2.tag_);
1107 swap(i1.module_, i2.module_);
1125 const auto&
decls()
const {
return decls_; }
1134 void stream(fe::Tab&, std::ostream&)
const override;
Some "global" variables needed all over the place.
Error & error(Loc loc, std::format_string< Args... > s, Args &&... args)
Error & warn(Loc loc, std::format_string< Args... > s, Args &&... args)
Error & note(Loc loc, std::format_string< Args... > s, Args &&... args)
A dependent function type.
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 & warn(Loc loc, std::format_string< Args... > fmt, Args &&... args) const
AnnexInfo * name2annex(Dbg dbg, sub_t *)
void bootstrap_py(Sym plugin, std::ostream &h)
Sym sym(std::string_view s)
const auto & plugin2annexes(Sym plugin)
void bootstrap(Sym plugin, std::ostream &h)
const Error & error() const
Error & note(Loc loc, std::format_string< Args... > fmt, Args &&... args) const
Sym sym_return()
"return".
Error & error(Loc loc, std::format_string< Args... > 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
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
void stream(fe::Tab &, std::ostream &) 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
void stream(fe::Tab &, std::ostream &) const override
const Expr * callee() const
void emit_body(Emitter &, const Def *decl) const override
void stream(fe::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
void bind(Scopes &, const AxmDecl *) const
void stream(fe::Tab &, std::ostream &) const override
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
void stream(fe::Tab &, std::ostream &) const override
const auto & sub(size_t i) const
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
void emit(Emitter &) const override
const Expr * codom() const
void stream(fe::Tab &, std::ostream &) const override
void bind(Scopes &) const override
const Expr * expr() const
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 stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void bind(Scopes &) 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
void stream(fe::Tab &, std::ostream &) const override
const Def * emit(Emitter &) const
virtual void emit_body(Emitter &, const Def *) const
virtual void bind(Scopes &) const =0
ast::Prec Prec
Backward-compatible alias; prefer the free-standing ast::Prec.
virtual const Def * emit_(Emitter &) const =0
virtual const Def * emit_decl(Emitter &, const Def *) const
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
void stream(fe::Tab &, std::ostream &) const override
const IdPtrn * id() const
void bind(Scopes &) const override
void stream(fe::Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
void stream(fe::Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
void bind(Scopes &) const override
const Decl * decl() const
void stream(fe::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)
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
void stream(fe::Tab &, std::ostream &) const
const Def * emit_(Emitter &) const override
void stream(fe::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
void stream(fe::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
void stream(fe::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
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 stream(fe::Tab &, std::ostream &) const override
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
const Def * emit_decl(Emitter &, const Def *type) const override
void stream(fe::Tab &, std::ostream &) const override
void bind(Scopes &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * value() const
const Ptrn * ptrn() const
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
void stream(fe::Tab &, std::ostream &) const override
Lam * emit(Emitter &) const
Arm(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&body)
void stream(fe::Tab &, std::ostream &) const override
const Expr * body() const
virtual void bind(Scopes &) const
const Ptrn * ptrn() const
MatchExpr(Loc loc, Ptr< Expr > &&scrutinee, Ptrs< Arm > &&arms)
void bind(Scopes &) const override
const Def * emit_(Emitter &) const override
const Expr * scrutinee() const
void stream(fe::Tab &, std::ostream &) const override
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
void stream(fe::Tab &, std::ostream &) const override
virtual void stream(fe::Tab &, std::ostream &) const =0
virtual void emit_type(Emitter &) const
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
void stream(fe::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)
void stream(fe::Tab &, std::ostream &) const override
const Def * emit_decl(Emitter &, const Def *type) const override
void bind(Scopes &) const override
void emit_body(Emitter &, const Def *decl) const override
void stream(fe::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
void stream(fe::Tab &, std::ostream &) 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
const Ptrn * ptrn() const
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
void bind(Scopes &) const override
void stream(fe::Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const Expr * body() const
const Expr * callee() const
void bind(Scopes &) const override
RuleDecl(Loc loc, Dbg dbg, Ptr< Ptrn > &&var, Ptr< Expr > &&lhs, Ptr< Expr > &&rhs, Ptr< Expr > &&guard, bool is_normalizer)
const Expr * guard() const
bool is_normalizer() const
void emit(Emitter &) const override
void stream(fe::Tab &, std::ostream &) const override
RuleExpr(Loc loc, Ptr< Expr > &&dom)
void bind(Scopes &) const override
const Def * emit_(Emitter &) const override
void stream(fe::Tab &, std::ostream &) const override
SeqExpr(Loc loc, bool is_pack, Ptr< IdPtrn > &&arity, Ptr< Expr > &&body)
const Expr * body() const
const IdPtrn * arity() const
void bind(Scopes &) const override
void stream(fe::Tab &, std::ostream &) const override
const Def * emit_(Emitter &) const override
const TuplePtrn * ptrn() const
const Def * emit_(Emitter &) 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
void stream(fe::Tab &, std::ostream &) 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)
const Def * emit_(Emitter &) const override
void stream(fe::Tab &, std::ostream &) 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
void stream(fe::Tab &, std::ostream &) const override
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
const Def * emit_(Emitter &) const override
const Expr * level() const
TypeExpr(Loc loc, Ptr< Expr > &&level)
void stream(fe::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
void stream(fe::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
void stream(fe::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 >)
AST load_plugin(World &w, Sym sym)
std::deque< Ptr< T > > Ptrs
Prec
Expression precedences used by the parser and the dumper; ordered low to high.
static constexpr flags_t flags(plugin_t p, tag_t t, sub_t s=0)
Assembles the full flags from its plugin, tag, and sub fields.
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
plugin_t plugin_id() const
The mangled plugin part of the flags.
AnnexInfo(Sym sym_plugin, Sym sym_tag, tag_t id_tag)
flags_t base() const
The base flags (plugin + tag, no sub).