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 {
38 plugin_t plugin;
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 ///@{
138 enum class Prec {
139 Err,
140 Bot,
141 Where,
142 Arrow,
143 Pi,
144 App,
145 Extract,
146 Lit,
147 };
148
149 static constexpr bool is_rassoc(Prec p) { return p == Prec::Arrow; }
150 ///@}
151
152 Ref emit(Emitter&) const;
153 virtual void bind(Scopes&) const = 0;
154 virtual Ref emit_decl(Emitter&, Ref /*type*/) const { fe::unreachable(); }
155 virtual void emit_body(Emitter&, Ref /*decl*/) const { fe::unreachable(); }
156
157private:
158 virtual Ref emit_(Emitter&) const = 0;
159};
160
161class Decl : public Node {
162protected:
164 : Node(loc) {}
165
166public:
167 Ref def() const { return def_; }
168
169protected:
170 mutable Ref def_ = nullptr;
171};
172
173class ValDecl : public Decl {
174protected:
176 : Decl(loc) {}
177
178public:
179 virtual void bind(Scopes&) const = 0;
180 virtual void emit(Emitter&) const = 0;
181};
182
183/*
184 * Ptrn
185 */
186
187class Ptrn : public Decl {
188public:
190 : Decl(loc) {}
191
192 virtual bool is_implicit() const { return false; }
193
194 virtual void bind(Scopes&, bool rebind, bool quiet) const = 0;
195 virtual Ref emit_value(Emitter&, Ref) const = 0;
196 virtual Ref emit_type(Emitter&) const = 0;
197
198 [[nodiscard]] static Ptr<Expr> to_expr(AST&, Ptr<Ptrn>&&);
199 [[nodiscard]] static Ptr<Ptrn> to_ptrn(Ptr<Expr>&&);
200};
201
202class ErrorPtrn : public Ptrn {
203public:
205 : Ptrn(loc) {}
206
207 void bind(Scopes&, bool rebind, bool quiet) const override;
208 Ref emit_value(Emitter&, Ref) const override;
209 Ref emit_type(Emitter&) const override;
210 std::ostream& stream(Tab&, std::ostream&) const override;
211};
212
213/// `dbg: type`
214class IdPtrn : public Ptrn {
215public:
217 : Ptrn(loc)
218 , dbg_(dbg)
219 , type_(std::move(type)) {}
220
221 Dbg dbg() const { return dbg_; }
222 const Expr* type() const { return type_.get(); }
223
225 auto loc = type->loc();
226 return ast.ptr<IdPtrn>(loc, Dbg(loc, ast.sym_anon()), std::move(type));
227 }
229 auto loc = (type && dbg) ? dbg.loc() + type->loc() : type ? type->loc() : dbg.loc();
230 return ast.ptr<IdPtrn>(loc, dbg, std::move(type));
231 }
232
233 void bind(Scopes&, bool rebind, bool quiet) const override;
234 Ref emit_value(Emitter&, Ref) const override;
235 Ref emit_type(Emitter&) const override;
236 std::ostream& stream(Tab&, std::ostream&) const override;
237
238private:
239 Dbg dbg_;
240 Ptr<Expr> type_;
241};
242
243/// If you have `x1 x2 x3 x4: T` it consists of 3 GrpPtrn%s and 1 IdPtrn while each GrpPtrn references the last IdPtrn.
244class GrpPtrn : public Ptrn {
245public:
246 GrpPtrn(Dbg dbg, const IdPtrn* id)
247 : Ptrn(dbg.loc())
248 , dbg_(dbg)
249 , id_(id) {}
250
251 Dbg dbg() const { return dbg_; }
252 const IdPtrn* id() const { return id_; }
253
254 void bind(Scopes&, bool rebind, bool quiet) const override;
255 Ref emit_value(Emitter&, Ref) const override;
256 Ref emit_type(Emitter&) const override;
257 std::ostream& stream(Tab&, std::ostream&) const override;
258
259private:
260 Dbg dbg_;
261 const IdPtrn* id_;
262};
263
264/// `ptrn as id`
265class AliasPtrn : public Ptrn {
266public:
268 : Ptrn(loc)
269 , ptrn_(std::move(ptrn))
270 , dbg_(dbg) {}
271
272 const Ptrn* ptrn() const { return ptrn_.get(); }
273 Dbg dbg() const { return dbg_; }
274 bool is_implicit() const override { return ptrn()->is_implicit(); }
275
276 void bind(Scopes&, bool rebind, bool quiet) const override;
277 Ref emit_value(Emitter&, Ref) const override;
278 Ref emit_type(Emitter&) const override;
279 std::ostream& stream(Tab&, std::ostream&) const override;
280
281private:
282 Ptr<Ptrn> ptrn_;
283 Dbg dbg_;
284};
285
286/// `(ptrn_0, ..., ptrn_n-1)`, `[ptrn_0, ..., ptrn_n-1]`, or `{ptrn_0, ..., ptrn_n-1}`
287class TuplePtrn : public Ptrn {
288public:
290 : Ptrn(loc)
291 , delim_l_(delim_l)
292 , ptrns_(std::move(ptrns)) {}
293
294 Tok::Tag delim_l() const { return delim_l_; }
295 Tok::Tag delim_r() const { return Tok::delim_l2r(delim_l()); }
296 bool is_paren() const { return delim_l() == Tok::Tag::D_paren_l; }
297 bool is_brckt() const { return delim_l() == Tok::Tag::D_brckt_l; }
298 bool is_implicit() const override { return delim_l_ == Tok::Tag::D_brace_l; }
299
300 const auto& ptrns() const { return ptrns_; }
301 const Ptrn* ptrn(size_t i) const { return ptrns_[i].get(); }
302 size_t num_ptrns() const { return ptrns().size(); }
303
304 void bind(Scopes&, bool rebind, bool quiet) const override;
305 Ref emit_value(Emitter&, Ref) const override;
306 Ref emit_type(Emitter&) const override;
307 Ref emit_decl(Emitter&, Ref type) const;
308 Ref emit_body(Emitter&, Ref decl) const;
309 std::ostream& stream(Tab&, std::ostream&) const override;
310
311private:
312 Tok::Tag delim_l_;
313 Ptrs<Ptrn> ptrns_;
314};
315
316/*
317 * Expr
318 */
319
320class ErrorExpr : public Expr {
321public:
323 : Expr(loc) {}
324
325 void bind(Scopes&) const override;
326 std::ostream& stream(Tab&, std::ostream&) const override;
327
328private:
329 Ref emit_(Emitter&) const override;
330};
331
332class InferExpr : public Expr {
333public:
335 : Expr(loc) {}
336
337 void bind(Scopes&) const override;
338 std::ostream& stream(Tab&, std::ostream&) const override;
339
340private:
341 Ref emit_(Emitter&) const override;
342};
343
344/// `sym`
345class IdExpr : public Expr {
346public:
348 : Expr(dbg.loc())
349 , dbg_(dbg) {}
350
351 Dbg dbg() const { return dbg_; }
352 const Decl* decl() const { return decl_; }
353
354 void bind(Scopes&) const override;
355 std::ostream& stream(Tab&, std::ostream&) const override;
356
357private:
358 Ref emit_(Emitter&) const override;
359
360 Dbg dbg_;
361 mutable const Decl* decl_ = nullptr;
362};
363
364/// `tag`
365class PrimaryExpr : public Expr {
366public:
368 : Expr(loc)
369 , tag_(tag) {}
371 : PrimaryExpr(tok.loc(), tok.tag()) {}
372
373 Tok::Tag tag() const { return tag_; }
374
375 void bind(Scopes&) const override;
376 std::ostream& stream(Tab&, std::ostream&) const override;
377
378private:
379 Ref emit_(Emitter&) const override;
380
381 Tok::Tag tag_;
382};
383
384/// `tok:type`
385class LitExpr : public Expr {
386public:
388 : Expr(loc)
389 , tok_(tok)
390 , type_(std::move(type)) {}
391
392 Tok tok() const { return tok_; }
393 Tok::Tag tag() const { return tok_.tag(); }
394 const Expr* type() const { return type_.get(); }
395
396 void bind(Scopes&) const override;
397 std::ostream& stream(Tab&, std::ostream&) const override;
398
399private:
400 Ref emit_(Emitter&) const override;
401
402 Tok tok_;
403 Ptr<Expr> type_;
404};
405
406/// `decls e` or `e where decls` if @p where is `true`.
407class DeclExpr : public Expr {
408public:
410 : Expr(loc)
411 , decls_(std::move(decls))
412 , expr_(std::move(expr))
413 , is_where_(is_where) {}
414
415 const auto& decls() const { return decls_; }
416 bool is_where() const { return is_where_; }
417 const Expr* expr() const { return expr_.get(); }
418
419 void bind(Scopes&) const override;
420 std::ostream& stream(Tab&, std::ostream&) const override;
421
422private:
423 Ref emit_(Emitter&) const override;
424
425 Ptrs<ValDecl> decls_;
426 Ptr<Expr> expr_;
427 bool is_where_;
428};
429
430/// `Type level`
431class TypeExpr : public Expr {
432public:
434 : Expr(loc)
435 , level_(std::move(level)) {}
436
437 const Expr* level() const { return level_.get(); }
438
439 void bind(Scopes&) const override;
440 std::ostream& stream(Tab&, std::ostream&) const override;
441
442private:
443 Ref emit_(Emitter&) const override;
444
445 Ptr<Expr> level_;
446};
447
448// lam
449
450/// `dom -> codom`
451class ArrowExpr : public Expr {
452public:
453 ArrowExpr(Loc loc, Ptr<Expr>&& dom, Ptr<Expr>&& codom)
454 : Expr(loc)
455 , dom_(std::move(dom))
456 , codom_(std::move(codom)) {}
457
458private:
459 const Expr* dom() const { return dom_.get(); }
460 const Expr* codom() const { return codom_.get(); }
461
462 void bind(Scopes&) const override;
463 Ref emit_decl(Emitter&, Ref type) const override;
464 void emit_body(Emitter&, Ref decl) const override;
465 std::ostream& stream(Tab&, std::ostream&) const override;
466
467private:
468 Ref emit_(Emitter&) const override;
469
470 Ptr<Expr> dom_;
471 Ptr<Expr> codom_;
472 mutable Pi* decl_ = nullptr;
473};
474
475/// One of:
476/// * ` {ptrn} → codom`
477/// * `Cn prn`
478/// * `Fn prn → codom`
479class PiExpr : public Expr {
480public:
481 class Dom : public Node {
482 public:
484 : Node(loc)
485 , ptrn_(std::move(ptrn)) {}
486
487 bool is_implicit() const { return ptrn_->is_implicit(); }
488 const Ptrn* ptrn() const { return ptrn_.get(); }
489 const IdPtrn* ret() const { return ret_.get(); }
490
491 void add_ret(AST& ast, Ptr<Expr>&& type) const {
492 auto loc = type->loc();
493 ret_ = ast.ptr<IdPtrn>(loc, Dbg(loc, ast.sym_return()), std::move(type));
494 }
495
496 virtual void bind(Scopes& scopes, bool quiet = false) const;
497 virtual void emit_type(Emitter&) const;
498 std::ostream& stream(Tab&, std::ostream&) const override;
499
500 protected:
501 mutable Pi* pi_ = nullptr;
502 mutable Pi* decl_ = nullptr;
503
504 private:
505 Ptr<Ptrn> ptrn_;
506 mutable Ptr<IdPtrn> ret_;
507
508 friend class PiExpr;
509 };
510
511 PiExpr(Loc loc, Tok::Tag tag, Ptr<Dom>&& dom, Ptr<Expr>&& codom)
512 : Expr(loc)
513 , tag_(tag)
514 , dom_(std::move(dom))
515 , codom_(std::move(codom)) {}
516
517private:
518 Tok::Tag tag() const { return tag_; }
519 const Dom* dom() const { return dom_.get(); }
520 const Expr* codom() const { return codom_.get(); }
521
522 void bind(Scopes&) const override;
523 Ref emit_decl(Emitter&, Ref type) const override;
524 void emit_body(Emitter&, Ref decl) const override;
525 std::ostream& stream(Tab&, std::ostream&) const override;
526
527private:
528 Ref emit_(Emitter&) const override;
529
530 Tok::Tag tag_;
531 Ptr<Dom> dom_;
532 Ptr<Expr> codom_;
533};
534
535/// Wraps a LamDecl as Expr.
536class LamExpr : public Expr {
537public:
539
540 const LamDecl* lam() const { return lam_.get(); }
541
542 void bind(Scopes&) const override;
543 Ref emit_decl(Emitter&, Ref type) const override;
544 void emit_body(Emitter&, Ref decl) const override;
545 std::ostream& stream(Tab&, std::ostream&) const override;
546
547private:
548 Ref emit_(Emitter&) const override;
549
550 Ptr<LamDecl> lam_;
551};
552
553/// `callee arg`
554class AppExpr : public Expr {
555public:
557 : Expr(loc)
558 , is_explicit_(is_explicit)
559 , callee_(std::move(callee))
560 , arg_(std::move(arg)) {}
561
562 bool is_explicit() const { return is_explicit_; }
563 const Expr* callee() const { return callee_.get(); }
564 const Expr* arg() const { return arg_.get(); }
565
566 void bind(Scopes&) const override;
567 std::ostream& stream(Tab&, std::ostream&) const override;
568
569private:
570 Ref emit_(Emitter&) const override;
571
572 bool is_explicit_;
573 Ptr<Expr> callee_;
574 Ptr<Expr> arg_;
575};
576
577/// `ret ptrn = callee $ arg; body`
578class RetExpr : public Expr {
579public:
581 : Expr(loc)
582 , ptrn_(std::move(ptrn))
583 , callee_(std::move(callee))
584 , arg_(std::move(arg))
585 , body_(std::move(body)) {}
586
587 const Ptrn* ptrn() const { return ptrn_.get(); }
588 const Expr* callee() const { return callee_.get(); }
589 const Expr* arg() const { return arg_.get(); }
590 const Expr* body() const { return body_.get(); }
591
592 void bind(Scopes&) const override;
593 std::ostream& stream(Tab&, std::ostream&) const override;
594
595private:
596 Ref emit_(Emitter&) const override;
597
598 Ptr<Ptrn> ptrn_;
599 Ptr<Expr> callee_;
600 Ptr<Expr> arg_;
601 Ptr<Expr> body_;
602};
603// tuple
604
605/// Just wraps TuplePtrn as Expr.
606class SigmaExpr : public Expr {
607public:
609 : Expr(ptrn->loc())
610 , ptrn_(std::move(ptrn)) {}
611
612 const TuplePtrn* ptrn() const { return ptrn_.get(); }
613
614 void bind(Scopes&) const override;
615 Ref emit_decl(Emitter&, Ref type) const override;
616 void emit_body(Emitter&, Ref decl) const override;
617 std::ostream& stream(Tab&, std::ostream&) const override;
618
619private:
620 Ref emit_(Emitter&) const override;
621
622 Ptr<TuplePtrn> ptrn_;
623
625};
626
627/// `(elem_0, ..., elem_n-1)`
628class TupleExpr : public Expr {
629public:
631 : Expr(loc)
632 , elems_(std::move(elems)) {}
633
634 const auto& elems() const { return elems_; }
635 const Expr* elem(size_t i) const { return elems_[i].get(); }
636 size_t num_elems() const { return elems().size(); }
637
638 void bind(Scopes&) const override;
639 std::ostream& stream(Tab&, std::ostream&) const override;
640
641private:
642 Ref emit_(Emitter&) const override;
643
644 Ptrs<Expr> elems_;
645};
646
647/// `«dbg: shape; body»` or `‹dbg: shape; body›`
648template<bool arr> class ArrOrPackExpr : public Expr {
649public:
651 : Expr(loc)
652 , shape_(std::move(shape))
653 , body_(std::move(body)) {}
654
655 const IdPtrn* shape() const { return shape_.get(); }
656 const Expr* body() const { return body_.get(); }
657
658 void bind(Scopes&) const override;
659 std::ostream& stream(Tab&, std::ostream&) const override;
660
661private:
662 Ref emit_(Emitter&) const override;
663
664 Ptr<IdPtrn> shape_;
665 Ptr<Expr> body_;
666};
667
670
671/// `tuple#index`
672class ExtractExpr : public Expr {
673public:
675 : Expr(loc)
676 , tuple_(std::move(tuple))
677 , index_(std::move(index)) {}
679 : Expr(loc)
680 , tuple_(std::move(tuple))
681 , index_(index) {}
682
683 const Expr* tuple() const { return tuple_.get(); }
684 const auto& index() const { return index_; }
685 const Decl* decl() const { return decl_; }
686
687 void bind(Scopes&) const override;
688 std::ostream& stream(Tab&, std::ostream&) const override;
689
690private:
691 Ref emit_(Emitter&) const override;
692
693 Ptr<Expr> tuple_;
694 std::variant<Ptr<Expr>, Dbg> index_;
695 mutable const Decl* decl_ = nullptr;
696};
697
698/// `ins(tuple, index, value)`
699class InsertExpr : public Expr {
700public:
702 : Expr(loc)
703 , tuple_(std::move(tuple))
704 , index_(std::move(index))
705 , value_(std::move(value)) {}
706
707 const Expr* tuple() const { return tuple_.get(); }
708 const Expr* index() const { return index_.get(); }
709 const Expr* value() const { return value_.get(); }
710
711 void bind(Scopes&) const override;
712 std::ostream& stream(Tab&, std::ostream&) const override;
713
714private:
715 Ref emit_(Emitter&) const override;
716
717 Ptr<Expr> tuple_;
718 Ptr<Expr> index_;
719 Ptr<Expr> value_;
720};
721
722/// `⦃ expr ⦄`
723class UniqExpr : public Expr {
724public:
725 UniqExpr(Loc loc, Ptr<Expr>&& expr)
726 : Expr(loc)
727 , inhabitant_(std::move(expr)) {}
728
729 const Expr* inhabitant() const { return inhabitant_.get(); }
730
731 void bind(Scopes&) const override;
732 std::ostream& stream(Tab&, std::ostream&) const override;
733
734private:
735 Ref emit_(Emitter&) const override;
736
737 Ptr<Expr> inhabitant_;
738};
739
740/*
741 * Decls
742 */
743
744/// `let ptrn: type = value;`
745class LetDecl : public ValDecl {
746public:
748 : ValDecl(loc)
749 , ptrn_(std::move(ptrn))
750 , value_(std::move(value)) {}
751
752 const Ptrn* ptrn() const { return ptrn_.get(); }
753 const Expr* value() const { return value_.get(); }
754
755 void bind(Scopes&) const override;
756 void emit(Emitter&) const override;
757 std::ostream& stream(Tab&, std::ostream&) const override;
758
759private:
760 Ptr<Ptrn> ptrn_;
761 Ptr<Expr> value_;
762 mutable AnnexInfo* annex_ = nullptr;
763 mutable sub_t sub_;
764};
765
766/// `axm ptrn: type = value;`
767class AxiomDecl : public ValDecl {
768public:
769 class Alias : public Decl {
770 public:
772 : Decl(dbg.loc())
773 , dbg_(dbg) {}
774
775 Dbg dbg() const { return dbg_; }
776
777 void bind(Scopes&, const AxiomDecl*) const;
778 std::ostream& stream(Tab&, std::ostream&) const override;
779
780 private:
781 Dbg dbg_;
782 mutable Dbg full_;
783
784 friend class AxiomDecl;
785 };
786
788 : ValDecl(loc)
789 , dbg_(dbg)
790 , subs_(std::move(subs))
791 , type_(std::move(type))
792 , normalizer_(normalizer)
793 , curry_(curry)
794 , trip_(trip) {}
795
796 Dbg dbg() const { return dbg_; }
797 const auto& subs() const { return subs_; }
798 size_t num_subs() const { return subs_.size(); }
799 const auto& sub(size_t i) const { return subs_[i]; }
800 const Expr* type() const { return type_.get(); }
801 Dbg normalizer() const { return normalizer_; }
802 Tok curry() const { return curry_; }
803 Tok trip() const { return trip_; }
804
805 void bind(Scopes&) const override;
806 void emit(Emitter&) const override;
807 std::ostream& stream(Tab&, std::ostream&) const override;
808
809private:
810 Dbg dbg_;
811 std::deque<Ptrs<Alias>> subs_;
812 Ptr<Expr> type_;
813 Dbg normalizer_;
814 Tok curry_, trip_;
815 mutable AnnexInfo* annex_ = nullptr;
816 mutable Ref mim_type_;
817};
818
819/// `.rec dbg: type = body`
820class RecDecl : public ValDecl {
821public:
823 : ValDecl(loc)
824 , dbg_(dbg)
825 , type_(std::move(type))
826 , body_(std::move(body))
827 , next_(std::move(next)) {}
828
829 Dbg dbg() const { return dbg_; }
830 const Expr* type() const { return type_.get(); }
831 const Expr* body() const { return body_.get(); }
832 const RecDecl* next() const { return next_.get(); }
833
834 void bind(Scopes&) const override;
835 virtual void bind_decl(Scopes&) const;
836 virtual void bind_body(Scopes&) const;
837
838 void emit(Emitter&) const override;
839 virtual void emit_decl(Emitter&) const;
840 virtual void emit_body(Emitter&) const;
841
842 std::ostream& stream(Tab&, std::ostream&) const override;
843
844private:
845 Dbg dbg_;
846 Ptr<Expr> type_;
847 Ptr<Expr> body_;
848 Ptr<RecDecl> next_;
849 mutable AnnexInfo* annex_ = nullptr;
850 mutable sub_t sub_;
851};
852
853/// One of:
854/// * `λ dom_0 ... dom_n-1 -> codom`
855/// * `cn dom_0 ... dom_n-1`
856/// * `fn dom_0 ... dom_n-1 -> codom`
857/// * `lam dbg dom_0 ... dom_n-1 -> codom`
858/// * `con dbg dom_0 ... dom_n-1`
859/// * `fun dbg dom_0 ... dom_n-1 -> codom`
860class LamDecl : public RecDecl {
861public:
862 class Dom : public PiExpr::Dom {
863 public:
865 : PiExpr::Dom(loc, std::move(ptrn))
866 , filter_(std::move(filter)) {}
867
868 bool is_implicit() const { return ptrn()->is_implicit(); }
869 const Expr* filter() const { return filter_.get(); }
870
871 void bind(Scopes& scopes, bool quiet = false) const override;
872 Lam* emit_value(Emitter&) const;
873 std::ostream& stream(Tab&, std::ostream&) const override;
874
875 private:
876 Ptr<Expr> filter_;
877 mutable Lam* lam_;
878
879 friend class LamDecl;
880 };
881
884 bool is_external,
885 Dbg dbg,
886 Ptrs<Dom>&& doms,
888 Ptr<Expr>&& body,
890 : RecDecl(loc, dbg, nullptr, std::move(body), std::move(next))
891 , tag_(tag)
892 , is_external_(is_external)
893 , doms_(std::move(doms))
894 , codom_(std::move(codom)) {
895 assert(num_doms() != 0);
896 }
897
898 Tok::Tag tag() const { return tag_; }
899 bool is_external() const { return is_external_; }
900 const Ptrs<Dom>& doms() const { return doms_; }
901 const Dom* dom(size_t i) const { return doms_[i].get(); }
902 size_t num_doms() const { return doms_.size(); }
903 const Expr* codom() const { return codom_.get(); }
904
905 void bind_decl(Scopes&) const override;
906 void bind_body(Scopes&) const override;
907 void emit_decl(Emitter&) const override;
908 void emit_body(Emitter&) const override;
909 std::ostream& stream(Tab&, std::ostream&) const override;
910
911private:
912 Tok::Tag tag_;
913 bool is_external_;
914 Ptrs<Dom> doms_;
915 Ptr<Expr> codom_;
916 mutable AnnexInfo* annex_ = nullptr;
917 mutable sub_t sub_;
918};
919
920/// `cfun dbg dom -> codom`
921class CDecl : public ValDecl {
922public:
924 : ValDecl(loc)
925 , tag_(tag)
926 , dbg_(dbg)
927 , dom_(std::move(dom))
928 , codom_(std::move(codom)) {}
929
930 Dbg dbg() const { return dbg_; }
931 Tok::Tag tag() const { return tag_; }
932 const Ptrn* dom() const { return dom_.get(); }
933 const Expr* codom() const { return codom_.get(); }
934
935 void bind(Scopes&) const override;
936 void emit(Emitter&) const override;
937 std::ostream& stream(Tab&, std::ostream&) const override;
938
939private:
940 Tok::Tag tag_;
941 Dbg dbg_;
942 Ptr<Ptrn> dom_;
943 Ptr<Expr> codom_;
944};
945
946/*
947 * Module
948 */
949
950class Import : public Node {
951public:
953 : Node(loc)
954 , dbg_(dbg)
955 , tag_(tag)
956 , module_(std::move(module)) {}
957
958 Dbg dbg() const { return dbg_; }
959 Tok::Tag tag() const { return tag_; }
960 const Module* module() const { return module_.get(); }
961
962 void bind(Scopes&) const;
963 void emit(Emitter&) const;
964 std::ostream& stream(Tab&, std::ostream&) const;
965
966 friend void swap(Import& i1, Import& i2) noexcept {
967 using std::swap;
968 swap(i1.dbg_, i2.dbg_);
969 swap(i1.tag_, i2.tag_);
970 swap(i1.module_, i2.module_);
971 }
972
973private:
974 Dbg dbg_;
975 Tok::Tag tag_;
976 Ptr<Module> module_;
977};
978
979class Module : public Node {
980public:
982 : Node(loc)
983 , imports_(std::move(imports))
984 , decls_(std::move(decls)) {}
985
986 const auto& implicit_imports() const { return implicit_imports_; }
987 const auto& imports() const { return imports_; }
988 const auto& decls() const { return decls_; }
989
990 void add_implicit_imports(Ptrs<Import>&& imports) const { implicit_imports_ = std::move(imports); }
991
992 void compile(AST&) const;
993 void bind(AST&) const;
994 void bind(Scopes&) const;
995 void emit(AST&) const;
996 void emit(Emitter&) const;
997 std::ostream& stream(Tab&, std::ostream&) const override;
998
999private:
1000 mutable Ptrs<Import> implicit_imports_;
1001 Ptrs<Import> imports_;
1002 Ptrs<ValDecl> decls_;
1003};
1004
1007 return load_plugins(w, Vector<Sym>(plugins.size(), [&](size_t i) { return w.sym(plugins[i]); }));
1008}
1009inline AST load_plugins(World& w, Sym sym) { return load_plugins(w, View<Sym>({sym})); }
1010inline AST load_plugins(World& w, const std::string& plugin) { return load_plugins(w, w.sym(plugin)); }
1011
1012} // namespace mim::ast
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:104
A dependent function type.
Definition lam.h:11
Helper class to retrieve Infer::arg if present.
Definition def.h:86
This is a thin wrapper for std::span<T, N> with the following additional features:
Definition span.h:28
Keeps track of indentation level.
Definition print.h:195
This is a thin wrapper for absl::InlinedVector<T, N, / A> which in turn is a drop-in replacement for ...
Definition vector.h:16
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition world.h:33
const Driver & driver() const
Definition world.h:81
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
ptrn as id
Definition ast.h:265
Dbg dbg() const
Definition ast.h:273
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:54
Ref emit_type(Emitter &) const override
Definition emit.cpp:82
const Ptrn * ptrn() const
Definition ast.h:272
bool is_implicit() const override
Definition ast.h:274
Ref emit_value(Emitter &, Ref) const override
Definition emit.cpp:62
AliasPtrn(Loc loc, Ptr< Ptrn > &&ptrn, Dbg dbg)
Definition ast.h:267
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:102
callee arg
Definition ast.h:554
AppExpr(Loc loc, bool is_explicit, Ptr< Expr > &&callee, Ptr< Expr > &&arg)
Definition ast.h:556
void bind(Scopes &) const override
Definition bind.cpp:166
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:126
bool is_explicit() const
Definition ast.h:562
const Expr * arg() const
Definition ast.h:564
const Expr * callee() const
Definition ast.h:563
Ref emit_(Emitter &) const override
Definition emit.cpp:247
«dbg: shape; body» or ‹dbg: shape; body›
Definition ast.h:648
const Expr * body() const
Definition ast.h:656
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:138
ArrOrPackExpr(Loc loc, Ptr< IdPtrn > &&shape, Ptr< Expr > &&body)
Definition ast.h:650
const IdPtrn * shape() const
Definition ast.h:655
Ref emit_(Emitter &) const override
Definition emit.cpp:277
void bind(Scopes &) const override
Definition bind.cpp:188
dom -> codom
Definition ast.h:451
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:108
Ref emit_(Emitter &) const override
Definition emit.cpp:197
void emit_body(Emitter &, Ref decl) const override
Definition emit.cpp:192
void bind(Scopes &) const override
Definition bind.cpp:141
Ref emit_decl(Emitter &, Ref type) const override
Definition emit.cpp:190
ArrowExpr(Loc loc, Ptr< Expr > &&dom, Ptr< Expr > &&codom)
Definition ast.h:453
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:160
void bind(Scopes &, const AxiomDecl *) const
Definition bind.cpp:220
axm ptrn: type = value;
Definition ast.h:767
const auto & subs() const
Definition ast.h:797
Tok curry() const
Definition ast.h:802
size_t num_subs() const
Definition ast.h:798
AxiomDecl(Loc loc, Dbg dbg, std::deque< Ptrs< Alias > > &&subs, Ptr< Expr > &&type, Dbg normalizer, Tok curry, Tok trip)
Definition ast.h:787
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:162
void bind(Scopes &) const override
Definition bind.cpp:226
const Expr * type() const
Definition ast.h:800
void emit(Emitter &) const override
Definition emit.cpp:343
Dbg dbg() const
Definition ast.h:796
Dbg normalizer() const
Definition ast.h:801
Tok trip() const
Definition ast.h:803
const auto & sub(size_t i) const
Definition ast.h:799
cfun dbg dom -> codom
Definition ast.h:921
Tok::Tag tag() const
Definition ast.h:931
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
Definition ast.h:923
const Ptrn * dom() const
Definition ast.h:932
void emit(Emitter &) const override
Definition emit.cpp:462
const Expr * codom() const
Definition ast.h:933
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:213
Dbg dbg() const
Definition ast.h:930
void bind(Scopes &) const override
Definition bind.cpp:327
decls e or e where decls if where is true.
Definition ast.h:407
const Expr * expr() const
Definition ast.h:417
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:93
const auto & decls() const
Definition ast.h:415
Ref emit_(Emitter &) const override
Definition emit.cpp:182
void bind(Scopes &) const override
Definition bind.cpp:133
bool is_where() const
Definition ast.h:416
DeclExpr(Loc loc, Ptrs< ValDecl > &&decls, Ptr< Expr > &&expr, bool is_where)
Definition ast.h:409
Decl(Loc loc)
Definition ast.h:163
Ref def() const
Definition ast.h:167
Ref emit_(Emitter &) const override
Definition emit.cpp:126
void bind(Scopes &) const override
Definition bind.cpp:118
ErrorExpr(Loc loc)
Definition ast.h:322
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:75
Ref emit_value(Emitter &, Ref) const override
Definition emit.cpp:53
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:204
Ref emit_type(Emitter &) const override
Definition emit.cpp:75
virtual void emit_body(Emitter &, Ref) const
Definition ast.h:155
virtual void bind(Scopes &) const =0
Expr(Loc loc)
Definition ast.h:132
virtual Ref emit_decl(Emitter &, Ref) const
Definition ast.h:154
virtual Ref emit_(Emitter &) const =0
Ref emit(Emitter &) const
Definition emit.cpp:121
static constexpr bool is_rassoc(Prec p)
Definition ast.h:149
tuple#index
Definition ast.h:672
const Decl * decl() const
Definition ast.h:685
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:145
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index)
Definition ast.h:674
const auto & index() const
Definition ast.h:684
const Expr * tuple() const
Definition ast.h:683
void bind(Scopes &) const override
Definition bind.cpp:198
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Dbg index)
Definition ast.h:678
Ref emit_(Emitter &) const override
Definition emit.cpp:309
If you have x1 x2 x3 x4: T it consists of 3 GrpPtrns and 1 IdPtrn while each GrpPtrn references the l...
Definition ast.h:244
GrpPtrn(Dbg dbg, const IdPtrn *id)
Definition ast.h:246
Ref emit_value(Emitter &, Ref) const override
Definition emit.cpp:60
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:95
Dbg dbg() const
Definition ast.h:251
Ref emit_type(Emitter &) const override
Definition emit.cpp:84
const IdPtrn * id() const
Definition ast.h:252
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:55
Dbg dbg() const
Definition ast.h:351
IdExpr(Dbg dbg)
Definition ast.h:347
void bind(Scopes &) const override
Definition bind.cpp:116
const Decl * decl() const
Definition ast.h:352
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:74
Ref emit_(Emitter &) const override
Definition emit.cpp:129
dbg: type
Definition ast.h:214
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:224
IdPtrn(Loc loc, Dbg dbg, Ptr< Expr > &&type)
Definition ast.h:216
static Ptr< IdPtrn > make_id(AST &ast, Dbg dbg, Ptr< Expr > &&type)
Definition ast.h:228
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:57
Ref emit_type(Emitter &) const override
Definition emit.cpp:77
Dbg dbg() const
Definition ast.h:221
const Expr * type() const
Definition ast.h:222
Ref emit_value(Emitter &, Ref) const override
Definition emit.cpp:55
friend void swap(Import &i1, Import &i2) noexcept
Definition ast.h:966
Import(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Module > &&module)
Definition ast.h:952
void bind(Scopes &) const
Definition bind.cpp:88
Dbg dbg() const
Definition ast.h:958
void emit(Emitter &) const
Definition emit.cpp:47
Tok::Tag tag() const
Definition ast.h:959
const Module * module() const
Definition ast.h:960
std::ostream & stream(Tab &, std::ostream &) const
Definition stream.cpp:41
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:76
InferExpr(Loc loc)
Definition ast.h:334
Ref emit_(Emitter &) const override
Definition emit.cpp:127
void bind(Scopes &) const override
Definition bind.cpp:119
ins(tuple, index, value)
Definition ast.h:699
Ref emit_(Emitter &) const override
Definition emit.cpp:330
InsertExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index, Ptr< Expr > &&value)
Definition ast.h:701
const Expr * index() const
Definition ast.h:708
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:150
void bind(Scopes &) const override
Definition bind.cpp:208
const Expr * tuple() const
Definition ast.h:707
const Expr * value() const
Definition ast.h:709
Lam * emit_value(Emitter &) const
Definition emit.cpp:414
const Expr * filter() const
Definition ast.h:869
bool is_implicit() const
Definition ast.h:868
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:189
Dom(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&filter)
Definition ast.h:864
void bind(Scopes &scopes, bool quiet=false) const override
Definition bind.cpp:285
One of:
Definition ast.h:860
Tok::Tag tag() const
Definition ast.h:898
void bind_body(Scopes &) const override
Definition bind.cpp:320
bool is_external() const
Definition ast.h:899
const Ptrs< Dom > & doms() const
Definition ast.h:900
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:196
const Expr * codom() const
Definition ast.h:903
void emit_decl(Emitter &) const override
Definition emit.cpp:428
size_t num_doms() const
Definition ast.h:902
void emit_body(Emitter &) const override
Definition emit.cpp:456
void bind_decl(Scopes &) const override
Definition bind.cpp:290
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:882
const Dom * dom(size_t i) const
Definition ast.h:901
Wraps a LamDecl as Expr.
Definition ast.h:536
Ref emit_decl(Emitter &, Ref type) const override
Definition emit.cpp:238
void emit_body(Emitter &, Ref decl) const override
Definition emit.cpp:239
void bind(Scopes &) const override
Definition bind.cpp:161
Ref emit_(Emitter &) const override
Definition emit.cpp:241
LamExpr(Ptr< LamDecl > &&lam)
Definition ast.cpp:159
const LamDecl * lam() const
Definition ast.h:540
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:124
let ptrn: type = value;
Definition ast.h:745
void bind(Scopes &) const override
Definition bind.cpp:257
const Expr * value() const
Definition ast.h:753
const Ptrn * ptrn() const
Definition ast.h:752
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:179
LetDecl(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&value)
Definition ast.h:747
void emit(Emitter &) const override
Definition emit.cpp:391
tok:type
Definition ast.h:385
Tok tok() const
Definition ast.h:392
const Expr * type() const
Definition ast.h:394
LitExpr(Loc loc, Tok tok, Ptr< Expr > &&type)
Definition ast.h:387
Tok::Tag tag() const
Definition ast.h:393
void bind(Scopes &) const override
Definition bind.cpp:123
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:79
Ref emit_(Emitter &) const override
Definition emit.cpp:165
Module(Loc loc, Ptrs< Import > &&imports, Ptrs< ValDecl > &&decls)
Definition ast.h:981
const auto & decls() const
Definition ast.h:988
void emit(AST &) const
Definition emit.cpp:35
const auto & implicit_imports() const
Definition ast.h:986
void bind(AST &) const
Definition bind.cpp:77
const auto & imports() const
Definition ast.h:987
void compile(AST &) const
Definition ast.cpp:183
void add_implicit_imports(Ptrs< Import > &&imports) const
Definition ast.h:990
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:203
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
Definition ast.h:483
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:112
virtual void bind(Scopes &scopes, bool quiet=false) const
Definition bind.cpp:146
const IdPtrn * ret() const
Definition ast.h:489
bool is_implicit() const
Definition ast.h:487
const Ptrn * ptrn() const
Definition ast.h:488
void add_ret(AST &ast, Ptr< Expr > &&type) const
Definition ast.h:491
One of:
Definition ast.h:479
void emit_body(Emitter &, Ref decl) const override
Definition emit.cpp:230
PiExpr(Loc loc, Tok::Tag tag, Ptr< Dom > &&dom, Ptr< Expr > &&codom)
Definition ast.h:511
Ref emit_(Emitter &) const override
Definition emit.cpp:232
Ref emit_decl(Emitter &, Ref type) const override
Definition emit.cpp:226
void bind(Scopes &) const override
Definition bind.cpp:151
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:118
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:77
Tok::Tag tag() const
Definition ast.h:373
void bind(Scopes &) const override
Definition bind.cpp:120
PrimaryExpr(Loc loc, Tok::Tag tag)
Definition ast.h:367
Ref emit_(Emitter &) const override
Definition emit.cpp:139
PrimaryExpr(Tok tok)
Definition ast.h:370
virtual Ref emit_value(Emitter &, Ref) const =0
virtual void bind(Scopes &, bool rebind, bool quiet) const =0
static Ptr< Ptrn > to_ptrn(Ptr< Expr > &&)
Definition ast.cpp:177
virtual Ref emit_type(Emitter &) const =0
static Ptr< Expr > to_expr(AST &, Ptr< Ptrn > &&)
Definition ast.cpp:167
Ptrn(Loc loc)
Definition ast.h:189
virtual bool is_implicit() const
Definition ast.h:192
.rec dbg: type = body
Definition ast.h:820
void emit(Emitter &) const override
Definition emit.cpp:397
Dbg dbg() const
Definition ast.h:829
virtual void emit_body(Emitter &) const
Definition emit.cpp:408
virtual void bind_body(Scopes &) const
Definition bind.cpp:283
virtual void emit_decl(Emitter &) const
Definition emit.cpp:402
RecDecl(Loc loc, Dbg dbg, Ptr< Expr > &&type, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
Definition ast.h:822
virtual void bind_decl(Scopes &) const
Definition bind.cpp:272
const Expr * body() const
Definition ast.h:831
const Expr * type() const
Definition ast.h:830
const RecDecl * next() const
Definition ast.h:832
void bind(Scopes &) const override
Definition bind.cpp:266
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:183
ret ptrn = callee $ arg; body
Definition ast.h:578
const Ptrn * ptrn() const
Definition ast.h:587
Ref emit_(Emitter &) const override
Definition emit.cpp:253
const Expr * arg() const
Definition ast.h:589
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
Definition ast.h:580
void bind(Scopes &) const override
Definition bind.cpp:171
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:130
const Expr * body() const
Definition ast.h:590
const Expr * callee() const
Definition ast.h:588
Just wraps TuplePtrn as Expr.
Definition ast.h:606
const TuplePtrn * ptrn() const
Definition ast.h:612
void emit_body(Emitter &, Ref decl) const override
Definition emit.cpp:269
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:135
Ref emit_(Emitter &) const override
Definition emit.cpp:270
Ref emit_decl(Emitter &, Ref type) const override
Definition emit.cpp:268
SigmaExpr(Ptr< TuplePtrn > &&ptrn)
Definition ast.h:608
void bind(Scopes &) const override
Definition bind.cpp:178
static constexpr Tok::Tag delim_l2r(Tag tag)
Definition tok.h:117
Tag tag() const
Definition tok.h:154
(elem_0, ..., elem_n-1)
Definition ast.h:628
const Expr * elem(size_t i) const
Definition ast.h:635
void bind(Scopes &) const override
Definition bind.cpp:184
TupleExpr(Loc loc, Ptrs< Expr > &&elems)
Definition ast.h:630
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:136
Ref emit_(Emitter &) const override
Definition emit.cpp:272
const auto & elems() const
Definition ast.h:634
size_t num_elems() const
Definition ast.h:636
(ptrn_0, ..., ptrn_n-1), [ptrn_0, ..., ptrn_n-1], or {ptrn_0, ..., ptrn_n-1}
Definition ast.h:287
bool is_implicit() const override
Definition ast.h:298
void bind(Scopes &, bool rebind, bool quiet) const override
Definition bind.cpp:107
bool is_paren() const
Definition ast.h:296
const Ptrn * ptrn(size_t i) const
Definition ast.h:301
Ref emit_value(Emitter &, Ref) const override
Definition emit.cpp:64
Tok::Tag delim_r() const
Definition ast.h:295
Ref emit_type(Emitter &) const override
Definition emit.cpp:86
Ref emit_decl(Emitter &, Ref type) const
Definition emit.cpp:111
const auto & ptrns() const
Definition ast.h:300
size_t num_ptrns() const
Definition ast.h:302
TuplePtrn(Loc loc, Tok::Tag delim_l, Ptrs< Ptrn > &&ptrns)
Definition ast.h:289
Tok::Tag delim_l() const
Definition ast.h:294
Ref emit_body(Emitter &, Ref decl) const
Definition emit.cpp:88
bool is_brckt() const
Definition ast.h:297
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:66
Type level
Definition ast.h:431
const Expr * level() const
Definition ast.h:437
TypeExpr(Loc loc, Ptr< Expr > &&level)
Definition ast.h:433
Ref emit_(Emitter &) const override
Definition emit.cpp:134
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:106
void bind(Scopes &) const override
Definition bind.cpp:117
⦃ expr ⦄
Definition ast.h:723
const Expr * inhabitant() const
Definition ast.h:729
void bind(Scopes &) const override
Definition bind.cpp:214
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:154
UniqExpr(Loc loc, Ptr< Expr > &&expr)
Definition ast.h:725
Ref emit_(Emitter &) const override
Definition emit.cpp:337
virtual void bind(Scopes &) const =0
virtual void emit(Emitter &) const =0
ValDecl(Loc loc)
Definition ast.h:175
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
std::string fmt(const char *s, Args &&... args)
Wraps mim::print to output a formatted std:string.
Definition print.h:155
u64 plugin_t
Definition types.h:46
u8 tag_t
Definition types.h:47
Definition span.h:104
static std::optional< plugin_t > mangle(Sym plugin)
Mangles s into a dense 48-bit representation.
Definition plugin.cpp:9
Loc loc() const
Definition dbg.h:146
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
std::optional< const Pi * > pi
Definition ast.h:44
struct mim::ast::AnnexInfo::@0 sym
AnnexInfo(Sym sym_plugin, Sym sym_tag, plugin_t id_plugin, tag_t id_tag)
Definition ast.h:26
struct mim::ast::AnnexInfo::@1 id