MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
ast.h
Go to the documentation of this file.
1#pragma once
2
3#include <deque>
4#include <memory>
5
6#include <fe/arena.h>
7#include <fe/assert.h>
8#include <fe/cast.h>
9
10#include "mim/driver.h"
11
12#include "mim/ast/tok.h"
13
14namespace mim::ast {
15
16class LamDecl;
17class Module;
18class Scopes;
19class Emitter;
20
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>;
24
25struct AnnexInfo {
26 AnnexInfo(Sym sym_plugin, Sym sym_tag, plugin_t id_plugin, tag_t id_tag)
27 : sym{sym_plugin, sym_tag}
28 , id{id_plugin, id_tag, 0, 0} {
29 assert(Annex::mangle(sym_plugin) == id_plugin);
30 }
31
32 bool is_pi() const { return pi && *pi && bool((*pi)->isa<Pi>()); }
33
34 struct {
35 Sym plugin, tag;
36 } sym;
37 struct {
39 tag_t tag;
40 uint8_t curry, trip;
41 } id;
42 std::deque<std::deque<Sym>> subs; ///< List of subs which is a list of aliases.
44 std::optional<const Pi*> pi;
45 bool fresh = true;
46};
47
48class AST {
49public:
50 AST() = default;
52 : world_(&world) {}
53 AST(AST&& other)
54 : AST() {
55 swap(*this, other);
56 }
57 ~AST();
58
59 /// @name Getters
60 ///@{
61 World& world() { return *world_; }
62 Driver& driver() { return world().driver(); }
63 Error& error() { return err_; }
64 const Error& error() const { return err_; }
65 ///@}
66
67 /// @name Sym
68 ///@{
69 Sym sym(const char* s) { return driver().sym(s); }
70 Sym sym(std::string_view s) { return driver().sym(s); }
71 Sym sym(const std::string& s) { return driver().sym(s); }
72 Sym sym_anon() { return sym("_"); } ///< `"_"`.
73 Sym sym_return() { return sym("return"); } ///< `"return"`.
74 Sym sym_error() { return sym("_error_"); } ///< `"_error_"`.
75 ///@}
76
77 template<class T, class... Args> auto ptr(Args&&... args) {
78 return arena_.mk<const T>(std::forward<Args&&>(args)...);
79 }
80
81 /// @name Formatted Output
82 ///@{
83 // clang-format off
84 template<class... Args> Error& error(Loc loc, const char* fmt, Args&&... args) const { return err_.error(loc, fmt, std::forward<Args&&>(args)...); }
85 template<class... Args> Error& warn (Loc loc, const char* fmt, Args&&... args) const { return err_.warn (loc, fmt, std::forward<Args&&>(args)...); }
86 template<class... Args> Error& note (Loc loc, const char* fmt, Args&&... args) const { return err_.note (loc, fmt, std::forward<Args&&>(args)...); }
87 // clang-format on
88 ///@}
89
90 /// @name Manage Annex
91 ///@{
93 const auto& plugin2annexes(Sym plugin) { return plugin2sym2annex_[plugin]; }
94 ///@}
95
96 void bootstrap(Sym plugin, std::ostream& h);
97
98 friend void swap(AST& a1, AST& a2) noexcept {
99 using std::swap;
100 // clang-format off
101 swap(a1.world_, a2.world_);
102 swap(a1.arena_, a2.arena_);
103 swap(a1.err_, a2.err_);
104 // clang-format on
105 }
106
107private:
108 World* world_ = nullptr;
109 fe::Arena arena_;
110 mutable Error err_;
111 absl::node_hash_map<fe::Sym, absl::node_hash_map<fe::Sym, AnnexInfo>> plugin2sym2annex_;
112};
113
114class Node : public fe::RuntimeCast<Node> {
115protected:
117 : loc_(loc) {}
118 virtual ~Node() {}
119
120public:
121 Loc loc() const { return loc_; }
122
123 virtual std::ostream& stream(Tab&, std::ostream&) const = 0;
124 void dump() const;
125
126private:
127 Loc loc_;
128};
129
130class Expr : public Node {
131protected:
133 : Node(loc) {}
134
135public:
136 /// @name Precedence
137 ///@{
150
151 static constexpr bool is_rassoc(Prec p) { return p == Prec::Arrow; }
152 ///@}
153
154 const Def* emit(Emitter&) const;
155 virtual void bind(Scopes&) const = 0;
156 virtual const Def* emit_decl(Emitter&, const Def* /*type*/) const { fe::unreachable(); }
157 virtual void emit_body(Emitter&, const Def* /*decl*/) const { fe::unreachable(); }
158
159private:
160 virtual const Def* emit_(Emitter&) const = 0;
161};
162
163class Decl : public Node {
164protected:
166 : Node(loc) {}
167
168public:
169 const Def* def() const { return def_; }
170
171protected:
172 mutable const Def* def_ = nullptr;
173};
174
175class ValDecl : public Decl {
176protected:
178 : Decl(loc) {}
179
180public:
181 virtual void bind(Scopes&) const = 0;
182 virtual void emit(Emitter&) const = 0;
183};
184
185/*
186 * Ptrn
187 */
188
189class Ptrn : public Decl {
190public:
192 : Decl(loc) {}
193
194 virtual bool is_implicit() const { return false; }
195
196 virtual void bind(Scopes&, bool rebind, bool quiet) const = 0;
197 virtual const Def* emit_value(Emitter&, const Def*) const = 0;
198 virtual const Def* emit_type(Emitter&) const = 0;
199
200 [[nodiscard]] static Ptr<Expr> to_expr(AST&, Ptr<Ptrn>&&);
201 [[nodiscard]] static Ptr<Ptrn> to_ptrn(Ptr<Expr>&&);
202};
203
204class ErrorPtrn : public Ptrn {
205public:
207 : Ptrn(loc) {}
208
209 void bind(Scopes&, bool rebind, bool quiet) const override;
210 const Def* emit_value(Emitter&, const Def*) const override;
211 const Def* emit_type(Emitter&) const override;
212 std::ostream& stream(Tab&, std::ostream&) const override;
213};
214
215/// `dbg: type`
216class IdPtrn : public Ptrn {
217public:
219 : Ptrn(loc)
220 , dbg_(dbg)
221 , type_(std::move(type)) {}
222
223 Dbg dbg() const { return dbg_; }
224 const Expr* type() const { return type_.get(); }
225
227 auto loc = type->loc();
228 return ast.ptr<IdPtrn>(loc, Dbg(loc, ast.sym_anon()), std::move(type));
229 }
231 auto loc = (type && dbg) ? dbg.loc() + type->loc() : type ? type->loc() : dbg.loc();
232 return ast.ptr<IdPtrn>(loc, dbg, std::move(type));
233 }
234
235 void bind(Scopes&, bool rebind, bool quiet) const override;
236 const Def* emit_value(Emitter&, const Def*) const override;
237 const Def* emit_type(Emitter&) const override;
238 std::ostream& stream(Tab&, std::ostream&) const override;
239
240private:
241 Dbg dbg_;
242 Ptr<Expr> type_;
243};
244
245/// If you have `x1 x2 x3 x4: T` it consists of 3 GrpPtrn%s and 1 IdPtrn while each GrpPtrn references the last IdPtrn.
246class GrpPtrn : public Ptrn {
247public:
248 GrpPtrn(Dbg dbg, const IdPtrn* id)
249 : Ptrn(dbg.loc())
250 , dbg_(dbg)
251 , id_(id) {}
252
253 Dbg dbg() const { return dbg_; }
254 const IdPtrn* id() const { return id_; }
255
256 void bind(Scopes&, bool rebind, bool quiet) const override;
257 const Def* emit_value(Emitter&, const Def*) const override;
258 const Def* emit_type(Emitter&) const override;
259 std::ostream& stream(Tab&, std::ostream&) const override;
260
261private:
262 Dbg dbg_;
263 const IdPtrn* id_;
264};
265
266/// `ptrn as id`
267class AliasPtrn : public Ptrn {
268public:
270 : Ptrn(loc)
271 , ptrn_(std::move(ptrn))
272 , dbg_(dbg) {}
273
274 const Ptrn* ptrn() const { return ptrn_.get(); }
275 Dbg dbg() const { return dbg_; }
276 bool is_implicit() const override { return ptrn()->is_implicit(); }
277
278 void bind(Scopes&, bool rebind, bool quiet) const override;
279 const Def* emit_value(Emitter&, const Def*) const override;
280 const Def* emit_type(Emitter&) const override;
281 std::ostream& stream(Tab&, std::ostream&) const override;
282
283private:
284 Ptr<Ptrn> ptrn_;
285 Dbg dbg_;
286};
287
288/// `(ptrn_0, ..., ptrn_n-1)`, `[ptrn_0, ..., ptrn_n-1]`, or `{ptrn_0, ..., ptrn_n-1}`
289class TuplePtrn : public Ptrn {
290public:
292 : Ptrn(loc)
293 , delim_l_(delim_l)
294 , ptrns_(std::move(ptrns)) {}
295
296 Tok::Tag delim_l() const { return delim_l_; }
297 Tok::Tag delim_r() const { return Tok::delim_l2r(delim_l()); }
298 bool is_paren() const { return delim_l() == Tok::Tag::D_paren_l; }
299 bool is_brckt() const { return delim_l() == Tok::Tag::D_brckt_l; }
300 bool is_implicit() const override { return delim_l_ == Tok::Tag::D_brace_l; }
301
302 const auto& ptrns() const { return ptrns_; }
303 const Ptrn* ptrn(size_t i) const { return ptrns_[i].get(); }
304 size_t num_ptrns() const { return ptrns().size(); }
305
306 void bind(Scopes&, bool rebind, bool quiet) const override;
307 const Def* emit_value(Emitter&, const Def*) const override;
308 const Def* emit_type(Emitter&) const override;
309 const Def* emit_decl(Emitter&, const Def* type) const;
310 const Def* emit_body(Emitter&, const Def* decl) const;
311 std::ostream& stream(Tab&, std::ostream&) const override;
312
313private:
314 Tok::Tag delim_l_;
315 Ptrs<Ptrn> ptrns_;
316};
317
318/*
319 * Expr
320 */
321
322class ErrorExpr : public Expr {
323public:
325 : Expr(loc) {}
326
327 void bind(Scopes&) const override;
328 std::ostream& stream(Tab&, std::ostream&) const override;
329
330private:
331 const Def* emit_(Emitter&) const override;
332};
333
334class HoleExpr : public Expr {
335public:
337 : Expr(loc) {}
338
339 void bind(Scopes&) const override;
340 std::ostream& stream(Tab&, std::ostream&) const override;
341
342private:
343 const Def* emit_(Emitter&) const override;
344};
345
346/// `sym`
347class IdExpr : public Expr {
348public:
350 : Expr(dbg.loc())
351 , dbg_(dbg) {}
352
353 Dbg dbg() const { return dbg_; }
354 const Decl* decl() const { return decl_; }
355
356 void bind(Scopes&) const override;
357 std::ostream& stream(Tab&, std::ostream&) const override;
358
359private:
360 const Def* emit_(Emitter&) const override;
361
362 Dbg dbg_;
363 mutable const Decl* decl_ = nullptr;
364};
365
366/// `tag`
367class PrimaryExpr : public Expr {
368public:
370 : Expr(loc)
371 , tag_(tag) {}
373 : PrimaryExpr(tok.loc(), tok.tag()) {}
374
375 Tok::Tag tag() const { return tag_; }
376
377 void bind(Scopes&) const override;
378 std::ostream& stream(Tab&, std::ostream&) const override;
379
380private:
381 const Def* emit_(Emitter&) const override;
382
383 Tok::Tag tag_;
384};
385
386/// `tok:type`
387class LitExpr : public Expr {
388public:
390 : Expr(loc)
391 , tok_(tok)
392 , type_(std::move(type)) {}
393
394 Tok tok() const { return tok_; }
395 Tok::Tag tag() const { return tok_.tag(); }
396 const Expr* type() const { return type_.get(); }
397
398 void bind(Scopes&) const override;
399 std::ostream& stream(Tab&, std::ostream&) const override;
400
401private:
402 const Def* emit_(Emitter&) const override;
403
404 Tok tok_;
405 Ptr<Expr> type_;
406};
407
408/// `decls e` or `e where decls` if @p where is `true`.
409class DeclExpr : public Expr {
410public:
412 : Expr(loc)
413 , decls_(std::move(decls))
414 , expr_(std::move(expr))
415 , is_where_(is_where) {}
416
417 const auto& decls() const { return decls_; }
418 bool is_where() const { return is_where_; }
419 const Expr* expr() const { return expr_.get(); }
420
421 void bind(Scopes&) const override;
422 std::ostream& stream(Tab&, std::ostream&) const override;
423
424private:
425 const Def* emit_(Emitter&) const override;
426
427 Ptrs<ValDecl> decls_;
428 Ptr<Expr> expr_;
429 bool is_where_;
430};
431
432/// `Type level`
433class TypeExpr : public Expr {
434public:
436 : Expr(loc)
437 , level_(std::move(level)) {}
438
439 const Expr* level() const { return level_.get(); }
440
441 void bind(Scopes&) const override;
442 std::ostream& stream(Tab&, std::ostream&) const override;
443
444private:
445 const Def* emit_(Emitter&) const override;
446
447 Ptr<Expr> level_;
448};
449
450// union
451
452/// `t1 ∪ t2`
453class UnionExpr : public Expr {
454public:
456 : Expr(loc)
457 , types_(std::move(types)) {}
458
459 const auto& types() const { return types_; }
460
461 void bind(Scopes&) const override;
462 std::ostream& stream(Tab&, std::ostream&) const override;
463
464private:
465 const Def* emit_(Emitter&) const override;
466
467 Ptrs<Expr> types_;
468};
469
470// injection
471
472/// `value inj t1 ∪ t2`
473class InjExpr : public Expr {
474public:
476 : Expr(loc)
477 , value_(std::move(value))
478 , type_(std::move(type)) {}
479
480 const Expr* value() const { return value_.get(); }
481 const Expr* type() const { return type_.get(); }
482
483 void bind(Scopes&) const override;
484 std::ostream& stream(Tab&, std::ostream&) const override;
485
486private:
487 const Def* emit_(Emitter&) const override;
488
489 Ptr<Expr> value_;
490 Ptr<Expr> type_;
491};
492
493// matching for destruction of sum types
494
495// n-ary match
496class MatchExpr : public Expr {
497public:
498 class Arm : public Node {
499 public:
501 : Node(loc)
502 , ptrn_(std::move(ptrn))
503 , body_(std::move(body)) {}
504
505 const Ptrn* ptrn() const { return ptrn_.get(); }
506 const Expr* body() const { return body_.get(); }
507
508 virtual void bind(Scopes&) const;
509 Lam* emit(Emitter&) const;
510 std::ostream& stream(Tab&, std::ostream&) const override;
511
512 private:
513 Ptr<Ptrn> ptrn_;
514 Ptr<Expr> body_;
515 };
516
518 : Expr(loc)
519 , scrutinee_(std::move(scrutinee))
520 , arms_(std::move(arms)) {}
521
522 const Expr* scrutinee() const { return scrutinee_.get(); }
523 const auto& arms() const { return arms_; }
524 const Arm* arm(size_t i) const { return arms_[i].get(); }
525 size_t num_arms() const { return arms_.size(); }
526
527 void bind(Scopes&) const override;
528 std::ostream& stream(Tab&, std::ostream&) const override;
529
530private:
531 const Def* emit_(Emitter&) const override;
532
533 Ptr<Expr> scrutinee_;
534 Ptrs<Arm> arms_;
535};
536
537// lam
538
539/// `dom -> codom`
540class ArrowExpr : public Expr {
541public:
542 ArrowExpr(Loc loc, Ptr<Expr>&& dom, Ptr<Expr>&& codom)
543 : Expr(loc)
544 , dom_(std::move(dom))
545 , codom_(std::move(codom)) {}
546
547private:
548 const Expr* dom() const { return dom_.get(); }
549 const Expr* codom() const { return codom_.get(); }
550
551 void bind(Scopes&) const override;
552 const Def* emit_decl(Emitter&, const Def* type) const override;
553 void emit_body(Emitter&, const Def* decl) const override;
554 std::ostream& stream(Tab&, std::ostream&) const override;
555
556private:
557 const Def* emit_(Emitter&) const override;
558
559 Ptr<Expr> dom_;
560 Ptr<Expr> codom_;
561 mutable Pi* decl_ = nullptr;
562};
563
564/// One of:
565/// * ` {ptrn} → codom`
566/// * `Cn prn`
567/// * `Fn prn → codom`
568class PiExpr : public Expr {
569public:
570 class Dom : public Node {
571 public:
573 : Node(loc)
574 , ptrn_(std::move(ptrn)) {}
575
576 bool is_implicit() const { return ptrn_->is_implicit(); }
577 const Ptrn* ptrn() const { return ptrn_.get(); }
578 const IdPtrn* ret() const { return ret_.get(); }
579
580 void add_ret(AST& ast, Ptr<Expr>&& type) const {
581 auto loc = type->loc();
582 ret_ = ast.ptr<IdPtrn>(loc, Dbg(loc, ast.sym_return()), std::move(type));
583 }
584
585 virtual void bind(Scopes&, bool quiet = false) const;
586 virtual void emit_type(Emitter&) const;
587 std::ostream& stream(Tab&, std::ostream&) const override;
588
589 protected:
590 const Pi* set_codom(const Def* codom) const {
591 if (auto imm = pi_->set_codom(codom)->immutabilize()) return const_pi_ = imm;
592 return const_pi_ = pi_;
593 }
594
595 mutable Pi* decl_ = nullptr;
596 mutable Pi* pi_ = nullptr;
597 mutable const Pi* const_pi_ = nullptr;
598
599 private:
600 Ptr<Ptrn> ptrn_;
601 mutable Ptr<IdPtrn> ret_;
602
603 friend class PiExpr;
604 };
605
606 PiExpr(Loc loc, Tok::Tag tag, Ptr<Dom>&& dom, Ptr<Expr>&& codom)
607 : Expr(loc)
608 , tag_(tag)
609 , dom_(std::move(dom))
610 , codom_(std::move(codom)) {}
611
612private:
613 Tok::Tag tag() const { return tag_; }
614 const Dom* dom() const { return dom_.get(); }
615 const Expr* codom() const { return codom_.get(); }
616
617 void bind(Scopes&) const override;
618 const Def* emit_decl(Emitter&, const Def* type) const override;
619 void emit_body(Emitter&, const Def* decl) const override;
620 std::ostream& stream(Tab&, std::ostream&) const override;
621
622private:
623 const Def* emit_(Emitter&) const override;
624
625 Tok::Tag tag_;
626 Ptr<Dom> dom_;
627 Ptr<Expr> codom_;
628};
629
630/// Wraps a LamDecl as Expr.
631class LamExpr : public Expr {
632public:
634
635 const LamDecl* lam() const { return lam_.get(); }
636
637 void bind(Scopes&) const override;
638 const Def* emit_decl(Emitter&, const Def* type) const override;
639 void emit_body(Emitter&, const Def* decl) const override;
640 std::ostream& stream(Tab&, std::ostream&) const override;
641
642private:
643 const Def* emit_(Emitter&) const override;
644
645 Ptr<LamDecl> lam_;
646};
647
648/// `callee arg`
649class AppExpr : public Expr {
650public:
652 : Expr(loc)
653 , is_explicit_(is_explicit)
654 , callee_(std::move(callee))
655 , arg_(std::move(arg)) {}
656
657 bool is_explicit() const { return is_explicit_; }
658 const Expr* callee() const { return callee_.get(); }
659 const Expr* arg() const { return arg_.get(); }
660
661 void bind(Scopes&) const override;
662 std::ostream& stream(Tab&, std::ostream&) const override;
663
664private:
665 const Def* emit_(Emitter&) const override;
666
667 bool is_explicit_;
668 Ptr<Expr> callee_;
669 Ptr<Expr> arg_;
670};
671
672/// `ret ptrn = callee $ arg; body`
673class RetExpr : public Expr {
674public:
676 : Expr(loc)
677 , ptrn_(std::move(ptrn))
678 , callee_(std::move(callee))
679 , arg_(std::move(arg))
680 , body_(std::move(body)) {}
681
682 const Ptrn* ptrn() const { return ptrn_.get(); }
683 const Expr* callee() const { return callee_.get(); }
684 const Expr* arg() const { return arg_.get(); }
685 const Expr* body() const { return body_.get(); }
686
687 void bind(Scopes&) const override;
688 std::ostream& stream(Tab&, std::ostream&) const override;
689
690private:
691 const Def* emit_(Emitter&) const override;
692
693 Ptr<Ptrn> ptrn_;
694 Ptr<Expr> callee_;
695 Ptr<Expr> arg_;
696 Ptr<Expr> body_;
697};
698// tuple
699
700/// Just wraps TuplePtrn as Expr.
701class SigmaExpr : public Expr {
702public:
704 : Expr(ptrn->loc())
705 , ptrn_(std::move(ptrn)) {}
706
707 const TuplePtrn* ptrn() const { return ptrn_.get(); }
708
709 void bind(Scopes&) const override;
710 const Def* emit_decl(Emitter&, const Def* type) const override;
711 void emit_body(Emitter&, const Def* decl) const override;
712 std::ostream& stream(Tab&, std::ostream&) const override;
713
714private:
715 const Def* emit_(Emitter&) const override;
716
717 Ptr<TuplePtrn> ptrn_;
718
720};
721
722/// `(elem_0, ..., elem_n-1)`
723class TupleExpr : public Expr {
724public:
726 : Expr(loc)
727 , elems_(std::move(elems)) {}
728
729 const auto& elems() const { return elems_; }
730 const Expr* elem(size_t i) const { return elems_[i].get(); }
731 size_t num_elems() const { return elems().size(); }
732
733 void bind(Scopes&) const override;
734 std::ostream& stream(Tab&, std::ostream&) const override;
735
736private:
737 const Def* emit_(Emitter&) const override;
738
739 Ptrs<Expr> elems_;
740};
741
742/// `«dbg: shape; body»` or `‹dbg: shape; body›`
743class SeqExpr : public Expr {
744public:
746 : Expr(loc)
747 , is_arr_(is_arr)
748 , shape_(std::move(shape))
749 , body_(std::move(body)) {}
750
751 bool is_arr() const { return is_arr_; }
752 const IdPtrn* shape() const { return shape_.get(); }
753 const Expr* body() const { return body_.get(); }
754
755 void bind(Scopes&) const override;
756 std::ostream& stream(Tab&, std::ostream&) const override;
757
758private:
759 const Def* emit_(Emitter&) const override;
760
761 bool is_arr_;
762 Ptr<IdPtrn> shape_;
763 Ptr<Expr> body_;
764};
765
766/// `tuple#index`
767class ExtractExpr : public Expr {
768public:
770 : Expr(loc)
771 , tuple_(std::move(tuple))
772 , index_(std::move(index)) {}
774 : Expr(loc)
775 , tuple_(std::move(tuple))
776 , index_(index) {}
777
778 const Expr* tuple() const { return tuple_.get(); }
779 const auto& index() const { return index_; }
780 const Decl* decl() const { return decl_; }
781
782 void bind(Scopes&) const override;
783 std::ostream& stream(Tab&, std::ostream&) const override;
784
785private:
786 const Def* emit_(Emitter&) const override;
787
788 Ptr<Expr> tuple_;
789 std::variant<Ptr<Expr>, Dbg> index_;
790 mutable const Decl* decl_ = nullptr;
791};
792
793/// `ins(tuple, index, value)`
794class InsertExpr : public Expr {
795public:
797 : Expr(loc)
798 , tuple_(std::move(tuple))
799 , index_(std::move(index))
800 , value_(std::move(value)) {}
801
802 const Expr* tuple() const { return tuple_.get(); }
803 const Expr* index() const { return index_.get(); }
804 const Expr* value() const { return value_.get(); }
805
806 void bind(Scopes&) const override;
807 std::ostream& stream(Tab&, std::ostream&) const override;
808
809private:
810 const Def* emit_(Emitter&) const override;
811
812 Ptr<Expr> tuple_;
813 Ptr<Expr> index_;
814 Ptr<Expr> value_;
815};
816
817/// `⦃ expr ⦄`
818class UniqExpr : public Expr {
819public:
820 UniqExpr(Loc loc, Ptr<Expr>&& expr)
821 : Expr(loc)
822 , inhabitant_(std::move(expr)) {}
823
824 const Expr* inhabitant() const { return inhabitant_.get(); }
825
826 void bind(Scopes&) const override;
827 std::ostream& stream(Tab&, std::ostream&) const override;
828
829private:
830 const Def* emit_(Emitter&) const override;
831
832 Ptr<Expr> inhabitant_;
833};
834
835/*
836 * Decls
837 */
838
839/// `let ptrn: type = value;`
840class LetDecl : public ValDecl {
841public:
843 : ValDecl(loc)
844 , ptrn_(std::move(ptrn))
845 , value_(std::move(value)) {}
846
847 const Ptrn* ptrn() const { return ptrn_.get(); }
848 const Expr* value() const { return value_.get(); }
849
850 void bind(Scopes&) const override;
851 void emit(Emitter&) const override;
852 std::ostream& stream(Tab&, std::ostream&) const override;
853
854private:
855 Ptr<Ptrn> ptrn_;
856 Ptr<Expr> value_;
857 mutable AnnexInfo* annex_ = nullptr;
858 mutable sub_t sub_ = 0;
859};
860
861/// `axm ptrn: type = value;`
862class AxmDecl : public ValDecl {
863public:
864 class Alias : public Decl {
865 public:
867 : Decl(dbg.loc())
868 , dbg_(dbg) {}
869
870 Dbg dbg() const { return dbg_; }
871
872 void bind(Scopes&, const AxmDecl*) const;
873 std::ostream& stream(Tab&, std::ostream&) const override;
874
875 private:
876 Dbg dbg_;
877 mutable Dbg full_;
878
879 friend class AxmDecl;
880 };
881
883 : ValDecl(loc)
884 , dbg_(dbg)
885 , subs_(std::move(subs))
886 , type_(std::move(type))
887 , normalizer_(normalizer)
888 , curry_(curry)
889 , trip_(trip) {}
890
891 Dbg dbg() const { return dbg_; }
892 const auto& subs() const { return subs_; }
893 size_t num_subs() const { return subs_.size(); }
894 const auto& sub(size_t i) const { return subs_[i]; }
895 const Expr* type() const { return type_.get(); }
896 Dbg normalizer() const { return normalizer_; }
897 Tok curry() const { return curry_; }
898 Tok trip() const { return trip_; }
899
900 void bind(Scopes&) const override;
901 void emit(Emitter&) const override;
902 std::ostream& stream(Tab&, std::ostream&) const override;
903
904private:
905 Dbg dbg_;
906 std::deque<Ptrs<Alias>> subs_;
907 Ptr<Expr> type_;
908 Dbg normalizer_;
909 Tok curry_, trip_;
910 mutable AnnexInfo* annex_ = nullptr;
911 mutable const Def* mim_type_;
912};
913
914/// `.rec dbg: type = body`
915class RecDecl : public ValDecl {
916public:
918 : ValDecl(loc)
919 , dbg_(dbg)
920 , type_(std::move(type))
921 , body_(std::move(body))
922 , next_(std::move(next)) {}
923
924 Dbg dbg() const { return dbg_; }
925 const Expr* type() const { return type_.get(); }
926 const Expr* body() const { return body_.get(); }
927 const RecDecl* next() const { return next_.get(); }
928
929 void bind(Scopes&) const override;
930 virtual void bind_decl(Scopes&) const;
931 virtual void bind_body(Scopes&) const;
932
933 void emit(Emitter&) const override;
934 virtual void emit_decl(Emitter&) const;
935 virtual void emit_body(Emitter&) const;
936
937 std::ostream& stream(Tab&, std::ostream&) const override;
938
939private:
940 Dbg dbg_;
941 Ptr<Expr> type_;
942 Ptr<Expr> body_;
943 Ptr<RecDecl> next_;
944 mutable AnnexInfo* annex_ = nullptr;
945 mutable sub_t sub_ = 0;
946};
947
948/// One of:
949/// * `λ dom_0 ... dom_n-1 -> codom`
950/// * `cn dom_0 ... dom_n-1`
951/// * `fn dom_0 ... dom_n-1 -> codom`
952/// * `lam dbg dom_0 ... dom_n-1 -> codom`
953/// * `con dbg dom_0 ... dom_n-1`
954/// * `fun dbg dom_0 ... dom_n-1 -> codom`
955class LamDecl : public RecDecl {
956public:
957 class Dom : public PiExpr::Dom {
958 public:
960 : PiExpr::Dom(loc, std::move(ptrn))
961 , filter_(std::move(filter)) {}
962
963 bool is_implicit() const { return ptrn()->is_implicit(); }
964 const Expr* filter() const { return filter_.get(); }
965
966 void bind(Scopes&, bool quiet = false) const override;
967 Lam* emit_value(Emitter&) const;
968 std::ostream& stream(Tab&, std::ostream&) const override;
969
970 private:
971 Ptr<Expr> filter_;
972 mutable Lam* lam_;
973
974 friend class LamDecl;
975 };
976
979 bool is_external,
980 Dbg dbg,
981 Ptrs<Dom>&& doms,
983 Ptr<Expr>&& body,
985 : RecDecl(loc, dbg, nullptr, std::move(body), std::move(next))
986 , tag_(tag)
987 , is_external_(is_external)
988 , doms_(std::move(doms))
989 , codom_(std::move(codom)) {
990 assert(num_doms() != 0);
991 }
992
993 Tok::Tag tag() const { return tag_; }
994 bool is_external() const { return is_external_; }
995 const Ptrs<Dom>& doms() const { return doms_; }
996 const Dom* dom(size_t i) const { return doms_[i].get(); }
997 size_t num_doms() const { return doms_.size(); }
998 const Expr* codom() const { return codom_.get(); }
999
1000 void bind_decl(Scopes&) const override;
1001 void bind_body(Scopes&) const override;
1002 void emit_decl(Emitter&) const override;
1003 void emit_body(Emitter&) const override;
1004 std::ostream& stream(Tab&, std::ostream&) const override;
1005
1006private:
1007 Tok::Tag tag_;
1008 bool is_external_;
1009 Ptrs<Dom> doms_;
1010 Ptr<Expr> codom_;
1011 mutable AnnexInfo* annex_ = nullptr;
1012 mutable sub_t sub_ = 0;
1013};
1014
1015/// `cfun dbg dom -> codom`
1016class CDecl : public ValDecl {
1017public:
1019 : ValDecl(loc)
1020 , tag_(tag)
1021 , dbg_(dbg)
1022 , dom_(std::move(dom))
1023 , codom_(std::move(codom)) {}
1024
1025 Dbg dbg() const { return dbg_; }
1026 Tok::Tag tag() const { return tag_; }
1027 const Ptrn* dom() const { return dom_.get(); }
1028 const Expr* codom() const { return codom_.get(); }
1029
1030 void bind(Scopes&) const override;
1031 void emit(Emitter&) const override;
1032 std::ostream& stream(Tab&, std::ostream&) const override;
1033
1034private:
1035 Tok::Tag tag_;
1036 Dbg dbg_;
1037 Ptr<Ptrn> dom_;
1038 Ptr<Expr> codom_;
1039};
1040
1041/*
1042 * Module
1043 */
1044
1045class Import : public Node {
1046public:
1048 : Node(loc)
1049 , dbg_(dbg)
1050 , tag_(tag)
1051 , module_(std::move(module)) {}
1052
1053 Dbg dbg() const { return dbg_; }
1054 Tok::Tag tag() const { return tag_; }
1055 const Module* module() const { return module_.get(); }
1056
1057 void bind(Scopes&) const;
1058 void emit(Emitter&) const;
1059 std::ostream& stream(Tab&, std::ostream&) const;
1060
1061 friend void swap(Import& i1, Import& i2) noexcept {
1062 using std::swap;
1063 swap(i1.dbg_, i2.dbg_);
1064 swap(i1.tag_, i2.tag_);
1065 swap(i1.module_, i2.module_);
1066 }
1067
1068private:
1069 Dbg dbg_;
1070 Tok::Tag tag_;
1071 Ptr<Module> module_;
1072};
1073
1074class Module : public Node {
1075public:
1077 : Node(loc)
1078 , imports_(std::move(imports))
1079 , decls_(std::move(decls)) {}
1080
1081 const auto& implicit_imports() const { return implicit_imports_; }
1082 const auto& imports() const { return imports_; }
1083 const auto& decls() const { return decls_; }
1084
1085 void add_implicit_imports(Ptrs<Import>&& imports) const { implicit_imports_ = std::move(imports); }
1086
1087 void compile(AST&) const;
1088 void bind(AST&) const;
1089 void bind(Scopes&) const;
1090 void emit(AST&) const;
1091 void emit(Emitter&) const;
1092 std::ostream& stream(Tab&, std::ostream&) const override;
1093
1094private:
1095 mutable Ptrs<Import> implicit_imports_;
1096 Ptrs<Import> imports_;
1097 Ptrs<ValDecl> decls_;
1098};
1099
1102 return load_plugins(w, Vector<Sym>(plugins.size(), [&](size_t i) { return w.sym(plugins[i]); }));
1103}
1104inline AST load_plugins(World& w, Sym sym) { return load_plugins(w, View<Sym>({sym})); }
1105inline AST load_plugins(World& w, const std::string& plugin) { return load_plugins(w, w.sym(plugin)); }
1106
1107} // namespace mim::ast
Base class for all Defs.
Definition def.h:203
Some "global" variables needed all over the place.
Definition driver.h:17
Error & error(Loc loc, const char *s, Args &&... args)
Definition dbg.h:71
Error & note(Loc loc, const char *s, Args &&... args)
Definition dbg.h:73
Error & warn(Loc loc, const char *s, Args &&... args)
Definition dbg.h:72
A function.
Definition lam.h:106
A dependent function type.
Definition lam.h:11
Keeps track of indentation level.
Definition print.h:196
This is a thin wrapper for absl::InlinedVector<T, N, A> which is a drop-in replacement for std::vecto...
Definition vector.h:17
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition world.h:33
const Driver & driver() const
Definition world.h:80
AST(AST &&other)
Definition ast.h:53
World & world()
Definition ast.h:61
friend void swap(AST &a1, AST &a2) noexcept
Definition ast.h:98
Driver & driver()
Definition ast.h:62
auto ptr(Args &&... args)
Definition ast.h:77
AST()=default
Error & error(Loc loc, const char *fmt, Args &&... args) const
Definition ast.h:84
AnnexInfo * name2annex(Dbg dbg, sub_t *)
Definition ast.cpp:14
Sym sym(std::string_view s)
Definition ast.h:70
const auto & plugin2annexes(Sym plugin)
Definition ast.h:93
void bootstrap(Sym plugin, std::ostream &h)
Definition ast.cpp:52
const Error & error() const
Definition ast.h:64
Sym sym_return()
"return".
Definition ast.h:73
Sym sym_anon()
"_".
Definition ast.h:72
Error & note(Loc loc, const char *fmt, Args &&... args) const
Definition ast.h:86
Error & error()
Definition ast.h:63
Sym sym(const char *s)
Definition ast.h:69
Error & warn(Loc loc, const char *fmt, Args &&... args) const
Definition ast.h:85
Sym sym_error()
"_error_".
Definition ast.h:74
Sym sym(const std::string &s)
Definition ast.h:71
AST(World &world)
Definition ast.h:51
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:65
Dbg dbg() const
Definition ast.h:275
const Def * emit_type(Emitter &) const override
Definition emit.cpp:87
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:54
const Ptrn * ptrn() const
Definition ast.h:274
bool is_implicit() const override
Definition ast.h:276
AliasPtrn(Loc loc, Ptr< Ptrn > &&ptrn, Dbg dbg)
Definition ast.h:269
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:102
AppExpr(Loc loc, bool is_explicit, Ptr< Expr > &&callee, Ptr< Expr > &&arg)
Definition ast.h:651
void bind(Scopes &) const override
Definition bind.cpp:187
const Def * emit_(Emitter &) const override
Definition emit.cpp:282
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:144
bool is_explicit() const
Definition ast.h:657
const Expr * arg() const
Definition ast.h:659
const Expr * callee() const
Definition ast.h:658
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:199
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:108
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:195
void bind(Scopes &) const override
Definition bind.cpp:141
ArrowExpr(Loc loc, Ptr< Expr > &&dom, Ptr< Expr > &&codom)
Definition ast.h:542
const Def * emit_(Emitter &) const override
Definition emit.cpp:204
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:175
void bind(Scopes &, const AxmDecl *) const
Definition bind.cpp:238
Dbg dbg() const
Definition ast.h:870
friend class AxmDecl
Definition ast.h:879
void emit(Emitter &) const override
Definition emit.cpp:375
const auto & subs() const
Definition ast.h:892
const Expr * type() const
Definition ast.h:895
Tok trip() const
Definition ast.h:898
size_t num_subs() const
Definition ast.h:893
AxmDecl(Loc loc, Dbg dbg, std::deque< Ptrs< Alias > > &&subs, Ptr< Expr > &&type, Dbg normalizer, Tok curry, Tok trip)
Definition ast.h:882
Tok curry() const
Definition ast.h:897
void bind(Scopes &) const override
Definition bind.cpp:244
Dbg normalizer() const
Definition ast.h:896
Dbg dbg() const
Definition ast.h:891
const auto & sub(size_t i) const
Definition ast.h:894
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:177
Tok::Tag tag() const
Definition ast.h:1026
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
Definition ast.h:1018
const Ptrn * dom() const
Definition ast.h:1027
void emit(Emitter &) const override
Definition emit.cpp:492
const Expr * codom() const
Definition ast.h:1028
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:228
Dbg dbg() const
Definition ast.h:1025
void bind(Scopes &) const override
Definition bind.cpp:345
const Expr * expr() const
Definition ast.h:419
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:93
const Def * emit_(Emitter &) const override
Definition emit.cpp:187
const auto & decls() const
Definition ast.h:417
void bind(Scopes &) const override
Definition bind.cpp:133
bool is_where() const
Definition ast.h:418
DeclExpr(Loc loc, Ptrs< ValDecl > &&decls, Ptr< Expr > &&expr, bool is_where)
Definition ast.h:411
Decl(Loc loc)
Definition ast.h:165
const Def * def_
Definition ast.h:172
const Def * def() const
Definition ast.h:169
void bind(Scopes &) const override
Definition bind.cpp:118
ErrorExpr(Loc loc)
Definition ast.h:324
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:75
const Def * emit_(Emitter &) const override
Definition emit.cpp:131
const Def * emit_type(Emitter &) const override
Definition emit.cpp:80
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:56
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:94
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:53
ErrorPtrn(Loc loc)
Definition ast.h:206
const Def * emit(Emitter &) const
Definition emit.cpp:126
virtual void emit_body(Emitter &, const Def *) const
Definition ast.h:157
virtual void bind(Scopes &) const =0
Expr(Loc loc)
Definition ast.h:132
virtual const Def * emit_(Emitter &) const =0
virtual const Def * emit_decl(Emitter &, const Def *) const
Definition ast.h:156
static constexpr bool is_rassoc(Prec p)
Definition ast.h:151
const Decl * decl() const
Definition ast.h:780
const Def * emit_(Emitter &) const override
Definition emit.cpp:341
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:160
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index)
Definition ast.h:769
const auto & index() const
Definition ast.h:779
const Expr * tuple() const
Definition ast.h:778
void bind(Scopes &) const override
Definition bind.cpp:216
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Dbg index)
Definition ast.h:773
const Def * emit_type(Emitter &) const override
Definition emit.cpp:89
GrpPtrn(Dbg dbg, const IdPtrn *id)
Definition ast.h:248
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:95
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:63
Dbg dbg() const
Definition ast.h:253
const IdPtrn * id() const
Definition ast.h:254
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:55
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:76
void bind(Scopes &) const override
Definition bind.cpp:119
const Def * emit_(Emitter &) const override
Definition emit.cpp:132
HoleExpr(Loc loc)
Definition ast.h:336
Dbg dbg() const
Definition ast.h:353
IdExpr(Dbg dbg)
Definition ast.h:349
const Def * emit_(Emitter &) const override
Definition emit.cpp:134
void bind(Scopes &) const override
Definition bind.cpp:116
const Decl * decl() const
Definition ast.h:354
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:74
dbg: type
Definition ast.h:216
const Def * emit_type(Emitter &) const override
Definition emit.cpp:82
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:97
static Ptr< IdPtrn > make_type(AST &ast, Ptr< Expr > &&type)
Definition ast.h:226
IdPtrn(Loc loc, Dbg dbg, Ptr< Expr > &&type)
Definition ast.h:218
static Ptr< IdPtrn > make_id(AST &ast, Dbg dbg, Ptr< Expr > &&type)
Definition ast.h:230
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:57
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:58
Dbg dbg() const
Definition ast.h:223
const Expr * type() const
Definition ast.h:224
friend void swap(Import &i1, Import &i2) noexcept
Definition ast.h:1061
Import(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Module > &&module)
Definition ast.h:1047
void bind(Scopes &) const
Definition bind.cpp:88
Dbg dbg() const
Definition ast.h:1053
void emit(Emitter &) const
Definition emit.cpp:50
Tok::Tag tag() const
Definition ast.h:1054
const Module * module() const
Definition ast.h:1055
std::ostream & stream(Tab &, std::ostream &) const
Definition stream.cpp:41
const Def * emit_(Emitter &) const override
Definition emit.cpp:216
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:114
const Expr * type() const
Definition ast.h:481
InjExpr(Loc loc, Ptr< Expr > &&value, Ptr< Expr > &&type)
Definition ast.h:475
void bind(Scopes &) const override
Definition bind.cpp:150
const Expr * value() const
Definition ast.h:480
InsertExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index, Ptr< Expr > &&value)
Definition ast.h:796
const Expr * index() const
Definition ast.h:803
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:165
void bind(Scopes &) const override
Definition bind.cpp:226
const Expr * tuple() const
Definition ast.h:802
const Def * emit_(Emitter &) const override
Definition emit.cpp:362
const Expr * value() const
Definition ast.h:804
Lam * emit_value(Emitter &) const
Definition emit.cpp:446
const Expr * filter() const
Definition ast.h:964
friend class LamDecl
Definition ast.h:974
bool is_implicit() const
Definition ast.h:963
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:204
void bind(Scopes &, bool quiet=false) const override
Definition bind.cpp:303
Dom(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&filter)
Definition ast.h:959
One of:
Definition ast.h:955
Tok::Tag tag() const
Definition ast.h:993
void bind_body(Scopes &) const override
Definition bind.cpp:338
bool is_external() const
Definition ast.h:994
const Ptrs< Dom > & doms() const
Definition ast.h:995
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:211
const Expr * codom() const
Definition ast.h:998
void emit_decl(Emitter &) const override
Definition emit.cpp:460
size_t num_doms() const
Definition ast.h:997
void emit_body(Emitter &) const override
Definition emit.cpp:486
void bind_decl(Scopes &) const override
Definition bind.cpp:308
LamDecl(Loc loc, Tok::Tag tag, bool is_external, Dbg dbg, Ptrs< Dom > &&doms, Ptr< Expr > &&codom, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
Definition ast.h:977
const Dom * dom(size_t i) const
Definition ast.h:996
void bind(Scopes &) const override
Definition bind.cpp:182
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:274
const Def * emit_(Emitter &) const override
Definition emit.cpp:276
LamExpr(Ptr< LamDecl > &&lam)
Definition ast.cpp:159
const LamDecl * lam() const
Definition ast.h:635
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:142
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:273
void bind(Scopes &) const override
Definition bind.cpp:275
const Expr * value() const
Definition ast.h:848
const Ptrn * ptrn() const
Definition ast.h:847
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:194
LetDecl(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&value)
Definition ast.h:842
void emit(Emitter &) const override
Definition emit.cpp:423
Tok tok() const
Definition ast.h:394
const Expr * type() const
Definition ast.h:396
const Def * emit_(Emitter &) const override
Definition emit.cpp:170
LitExpr(Loc loc, Tok tok, Ptr< Expr > &&type)
Definition ast.h:389
Tok::Tag tag() const
Definition ast.h:395
void bind(Scopes &) const override
Definition bind.cpp:123
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:79
Lam * emit(Emitter &) const
Definition emit.cpp:222
Arm(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&body)
Definition ast.h:500
const Expr * body() const
Definition ast.h:506
virtual void bind(Scopes &) const
Definition bind.cpp:155
const Ptrn * ptrn() const
Definition ast.h:505
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:118
MatchExpr(Loc loc, Ptr< Expr > &&scrutinee, Ptrs< Arm > &&arms)
Definition ast.h:517
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:122
void bind(Scopes &) const override
Definition bind.cpp:162
const Def * emit_(Emitter &) const override
Definition emit.cpp:231
const Expr * scrutinee() const
Definition ast.h:522
const Arm * arm(size_t i) const
Definition ast.h:524
size_t num_arms() const
Definition ast.h:525
const auto & arms() const
Definition ast.h:523
Module(Loc loc, Ptrs< Import > &&imports, Ptrs< ValDecl > &&decls)
Definition ast.h:1076
const auto & decls() const
Definition ast.h:1083
void emit(AST &) const
Definition emit.cpp:38
const auto & implicit_imports() const
Definition ast.h:1081
void bind(AST &) const
Definition bind.cpp:77
const auto & imports() const
Definition ast.h:1082
void compile(AST &) const
Definition ast.cpp:183
void add_implicit_imports(Ptrs< Import > &&imports) const
Definition ast.h:1085
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:43
virtual std::ostream & stream(Tab &, std::ostream &) const =0
void dump() const
Definition stream.cpp:32
virtual ~Node()
Definition ast.h:118
Loc loc() const
Definition ast.h:121
Node(Loc loc)
Definition ast.h:116
virtual void emit_type(Emitter &) const
Definition emit.cpp:238
const Pi * const_pi_
Definition ast.h:597
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
Definition ast.h:572
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:130
const Pi * set_codom(const Def *codom) const
Definition ast.h:590
virtual void bind(Scopes &, bool quiet=false) const
Definition bind.cpp:167
friend class PiExpr
Definition ast.h:603
const IdPtrn * ret() const
Definition ast.h:578
bool is_implicit() const
Definition ast.h:576
const Ptrn * ptrn() const
Definition ast.h:577
void add_ret(AST &ast, Ptr< Expr > &&type) const
Definition ast.h:580
const Def * emit_(Emitter &) const override
Definition emit.cpp:267
PiExpr(Loc loc, Tok::Tag tag, Ptr< Dom > &&dom, Ptr< Expr > &&codom)
Definition ast.h:606
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:261
void bind(Scopes &) const override
Definition bind.cpp:172
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:136
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:265
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:77
const Def * emit_(Emitter &) const override
Definition emit.cpp:144
Tok::Tag tag() const
Definition ast.h:375
void bind(Scopes &) const override
Definition bind.cpp:120
PrimaryExpr(Loc loc, Tok::Tag tag)
Definition ast.h:369
PrimaryExpr(Tok tok)
Definition ast.h:372
virtual void bind(Scopes &, bool rebind, bool quiet) const =0
static Ptr< Ptrn > to_ptrn(Ptr< Expr > &&)
Definition ast.cpp:177
static Ptr< Expr > to_expr(AST &, Ptr< Ptrn > &&)
Definition ast.cpp:167
virtual const Def * emit_value(Emitter &, const Def *) const =0
Ptrn(Loc loc)
Definition ast.h:191
virtual const Def * emit_type(Emitter &) const =0
virtual bool is_implicit() const
Definition ast.h:194
void emit(Emitter &) const override
Definition emit.cpp:429
Dbg dbg() const
Definition ast.h:924
virtual void emit_body(Emitter &) const
Definition emit.cpp:440
virtual void bind_body(Scopes &) const
Definition bind.cpp:301
virtual void emit_decl(Emitter &) const
Definition emit.cpp:434
RecDecl(Loc loc, Dbg dbg, Ptr< Expr > &&type, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
Definition ast.h:917
virtual void bind_decl(Scopes &) const
Definition bind.cpp:290
const Expr * body() const
Definition ast.h:926
const Expr * type() const
Definition ast.h:925
const RecDecl * next() const
Definition ast.h:927
void bind(Scopes &) const override
Definition bind.cpp:284
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:198
const Ptrn * ptrn() const
Definition ast.h:682
const Expr * arg() const
Definition ast.h:684
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
Definition ast.h:675
void bind(Scopes &) const override
Definition bind.cpp:192
const Def * emit_(Emitter &) const override
Definition emit.cpp:288
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:148
const Expr * body() const
Definition ast.h:685
const Expr * callee() const
Definition ast.h:683
const Expr * body() const
Definition ast.h:753
void bind(Scopes &) const override
Definition bind.cpp:209
bool is_arr() const
Definition ast.h:751
const IdPtrn * shape() const
Definition ast.h:752
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:156
const Def * emit_(Emitter &) const override
Definition emit.cpp:312
SeqExpr(Loc loc, bool is_arr, Ptr< IdPtrn > &&shape, Ptr< Expr > &&body)
Definition ast.h:745
const TuplePtrn * ptrn() const
Definition ast.h:707
const Def * emit_(Emitter &) const override
Definition emit.cpp:305
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:153
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:304
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:303
SigmaExpr(Ptr< TuplePtrn > &&ptrn)
Definition ast.h:703
void bind(Scopes &) const override
Definition bind.cpp:199
static constexpr Tok::Tag delim_l2r(Tag tag)
Definition tok.h:122
const Expr * elem(size_t i) const
Definition ast.h:730
void bind(Scopes &) const override
Definition bind.cpp:205
TupleExpr(Loc loc, Ptrs< Expr > &&elems)
Definition ast.h:725
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:154
const Def * emit_(Emitter &) const override
Definition emit.cpp:307
const auto & elems() const
Definition ast.h:729
size_t num_elems() const
Definition ast.h:731
(ptrn_0, ..., ptrn_n-1), [ptrn_0, ..., ptrn_n-1], or {ptrn_0, ..., ptrn_n-1}
Definition ast.h:289
bool is_implicit() const override
Definition ast.h:300
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:107
bool is_paren() const
Definition ast.h:298
const Ptrn * ptrn(size_t i) const
Definition ast.h:303
Tok::Tag delim_r() const
Definition ast.h:297
const Def * emit_type(Emitter &) const override
Definition emit.cpp:91
const Def * emit_decl(Emitter &, const Def *type) const
Definition emit.cpp:116
const auto & ptrns() const
Definition ast.h:302
size_t num_ptrns() const
Definition ast.h:304
TuplePtrn(Loc loc, Tok::Tag delim_l, Ptrs< Ptrn > &&ptrns)
Definition ast.h:291
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:69
Tok::Tag delim_l() const
Definition ast.h:296
const Def * emit_body(Emitter &, const Def *decl) const
Definition emit.cpp:93
bool is_brckt() const
Definition ast.h:299
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:66
const Def * emit_(Emitter &) const override
Definition emit.cpp:139
const Expr * level() const
Definition ast.h:439
TypeExpr(Loc loc, Ptr< Expr > &&level)
Definition ast.h:435
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:106
void bind(Scopes &) const override
Definition bind.cpp:117
UnionExpr(Loc loc, Ptrs< Expr > &&types)
Definition ast.h:455
void bind(Scopes &) const override
Definition bind.cpp:146
const auto & types() const
Definition ast.h:459
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:112
const Def * emit_(Emitter &) const override
Definition emit.cpp:210
const Expr * inhabitant() const
Definition ast.h:824
const Def * emit_(Emitter &) const override
Definition emit.cpp:369
void bind(Scopes &) const override
Definition bind.cpp:232
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:169
UniqExpr(Loc loc, Ptr< Expr > &&expr)
Definition ast.h:820
virtual void bind(Scopes &) const =0
virtual void emit(Emitter &) const =0
ValDecl(Loc loc)
Definition ast.h:177
Definition ast.h:14
std::deque< Dbg > Dbgs
Definition ast.h:23
fe::Arena::Ptr< const T > Ptr
Definition ast.h:21
AST load_plugins(World &, View< Sym >)
Definition ast.cpp:190
std::deque< Ptr< T > > Ptrs
Definition ast.h:22
u8 sub_t
Definition types.h:48
Span< const T, N > View
Definition span.h:93
std::string fmt(const char *s, Args &&... args)
Wraps mim::print to output a formatted std:string.
Definition print.h:156
u64 plugin_t
Definition types.h:46
u8 tag_t
Definition types.h:47
Definition span.h:114
static std::optional< plugin_t > mangle(Sym plugin)
Mangles s into a dense 48-bit representation.
Definition plugin.cpp:9
bool is_pi() const
Definition ast.h:32
std::deque< std::deque< Sym > > subs
List of subs which is a list of aliases.
Definition ast.h:42
struct mim::ast::AnnexInfo::@112046103026102051147230017206327014033073201371 sym
struct mim::ast::AnnexInfo::@177100250272201136376142224053244231100060214216 id
std::optional< const Pi * > pi
Definition ast.h:44
AnnexInfo(Sym sym_plugin, Sym sym_tag, plugin_t id_plugin, tag_t id_tag)
Definition ast.h:26