17 friend std::ostream&
operator<<(std::ostream& os,
const S& s) {
return s.node->stream(s.tab, os), os; }
23struct std::formatter<
mim::ast::S> : fe::ostream_formatter {};
38 friend std::ostream&
operator<<(std::ostream& os,
const R& r) {
39 for (std::string_view curr_sep{};
const auto& ptr : r.range) {
41 ptr->stream(r.tab, os);
51struct std::formatter<
mim::ast::R<T>> : fe::ostream_formatter {};
56 auto tab = fe::Tab::spaces();
58 std::cout << std::endl;
65void Import::stream(fe::Tab& tab, std::ostream& os)
const { std::println(os,
"{}{} '{}';", tab,
tag(),
"TODO"); }
68 for (
const auto&
import :
imports())
69 import->stream(tab, os);
70 for (
const auto& decl :
decls())
71 std::println(os,
"{}{}", tab,
S(tab, decl.get()));
84 if (
dbg() &&
type()) { std::print(os,
"{}: {}",
dbg(),
S(tab,
type()));
return; }
85 if (
dbg() && !
type()) { std::print(os,
"{}",
dbg());
return; }
86 if (!
dbg() &&
type()) { std::print(os,
"{}",
S(tab,
type()));
return; }
88 os <<
"<invalid identifier pattern>";
106 case Tag::L_i: std::print(os,
"{}",
tok().lit_i());
return;
107 case Tag::L_f: os << std::bit_cast<double>(
tok().lit_u());
return;
111 if (
type()) std::print(os,
": {}",
S(tab,
type()));
113 default: os <<
"TODO";
119 std::println(os,
"{}{} where", tab,
S(tab,
expr()));
121 for (
const auto& decl :
decls())
122 std::println(os,
"{}{}", tab,
S(tab, decl.get()));
125 for (
const auto& decl :
decls())
126 std::println(os,
"{}{}", tab,
S(tab, decl.get()));
127 std::print(os,
"{}",
S(tab,
expr()));
135 std::print(os,
"{} -> {}",
S(tab, dom()),
S(tab, codom()));
141 std::print(os,
"{} inj {}",
S(tab,
value()),
S(tab,
type()));
145 std::print(os,
"{} => {}",
S(tab,
ptrn()),
S(tab,
body()));
149 std::println(os,
"{}match {} with", tab,
S(tab,
scrutinee()));
152 std::println(os,
"{}| {}", tab,
S(tab,
arm.get()));
154 std::println(os,
"{}}}", tab);
159 if (
ret()) std::print(os,
" -> {}",
S(tab,
ret()->type()));
163 if (tag() != Tag::Nil) std::print(os,
"{} ", tag());
164 std::print(os,
"{}",
S(tab, dom()));
165 if (codom()) std::print(os,
" -> {}",
S(tab, codom()));
175 std::println(os,
"ret {} = {} $ {};",
S(tab,
ptrn()),
S(tab,
callee()),
S(tab,
arg()));
176 std::print(os,
"{}{}", tab,
S(tab,
body()));
188 std::print(os,
"{}#{}",
S(tab,
tuple()),
S(tab, expr->get()));
190 std::print(os,
"{}#{}",
S(tab,
tuple()), std::get<Dbg>(
index()));
206 std::print(os,
"axm {}",
dbg());
209 for (
auto sep =
"";
const auto& aliases :
subs()) {
210 std::print(os,
"{}{}", sep,
R(tab, aliases,
" = "));
215 std::print(os,
": {}",
S(tab,
type()));
218 if (
trip()) std::print(os,
", {}",
trip());
223 std::print(os,
"let {} = {};",
S(tab,
ptrn()),
S(tab,
value()));
227 std::print(os,
".rec {}",
dbg());
228 if (!
type()->isa<HoleExpr>()) std::print(os,
": {}",
S(tab,
type()));
229 std::print(os,
" = {};",
S(tab,
body()));
235 if (
ret()) std::print(os,
": {}",
S(tab,
ret()->
type()));
239 std::print(os,
"{} {}",
tag(),
dbg());
240 if (!
doms().front()->ptrn()->isa<TuplePtrn>()) os <<
' ';
241 std::print(os,
"{}",
R(tab,
doms()));
242 if (
codom()) std::print(os,
": {}",
S(tab,
codom()));
244 if (
body()->isa<DeclExpr>()) {
245 os <<
" =" << std::endl;
247 std::print(os,
"{}{}", tab,
S(tab,
body()));
250 std::print(os,
" = {}",
S(tab,
body()));
258 if (
tag() == Tag::K_cfun) std::print(os,
": {}",
S(tab,
codom()));
262 std::print(os,
"rule {} : {} => {} when {}",
S(tab,
var()),
S(tab,
lhs()),
S(tab,
rhs()),
S(tab,
guard()));
const Ptrn * ptrn() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * callee() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const auto & subs() const
const Expr * type() const
void stream(fe::Tab &, std::ostream &) const override
const Expr * codom() const
void stream(fe::Tab &, std::ostream &) const override
const Expr * expr() const
const auto & decls() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * type() const
void stream(fe::Tab &, std::ostream &) const
void stream(fe::Tab &, std::ostream &) const override
const Expr * type() const
const Expr * value() const
const Expr * index() const
void stream(fe::Tab &, std::ostream &) const override
const Expr * tuple() const
const Expr * value() const
const Expr * filter() const
void stream(fe::Tab &, std::ostream &) const override
const Ptrs< Dom > & doms() const
const Expr * codom() const
void stream(fe::Tab &, std::ostream &) const override
const LamDecl * lam() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * value() const
const Ptrn * ptrn() const
const Expr * type() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * body() const
const Ptrn * ptrn() const
const Expr * scrutinee() const
void stream(fe::Tab &, std::ostream &) const override
const Arm * arm(size_t i) const
const auto & arms() const
const auto & decls() const
const auto & imports() const
void stream(fe::Tab &, std::ostream &) const override
virtual void stream(fe::Tab &, std::ostream &) const =0
void stream(fe::Tab &, std::ostream &) const override
const IdPtrn * ret() const
const Ptrn * ptrn() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * body() const
const Expr * type() const
const Ptrn * ptrn() const
void stream(fe::Tab &, std::ostream &) const override
const Expr * body() const
const Expr * callee() const
const Expr * guard() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const Expr * body() const
const IdPtrn * arity() const
void stream(fe::Tab &, std::ostream &) const override
const TuplePtrn * ptrn() const
void stream(fe::Tab &, std::ostream &) const override
void stream(fe::Tab &, std::ostream &) const override
const auto & elems() const
void stream(fe::Tab &, std::ostream &) const override
const auto & ptrns() const
const Expr * level() const
void stream(fe::Tab &, std::ostream &) const override
const auto & types() const
void stream(fe::Tab &, std::ostream &) const override
const Expr * inhabitant() const
void stream(fe::Tab &, std::ostream &) const override
fe::Arena::Ptr< const T > Ptr
std::deque< Ptr< T > > Ptrs
R(fe::Tab &tab, const Ptrs< T > &range, std::string_view sep=", ")
friend std::ostream & operator<<(std::ostream &os, const R &r)
friend std::ostream & operator<<(std::ostream &os, const S &s)
S(fe::Tab &tab, const Node *node)