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 const Pi* set_codom(Ref codom) const {
502 if (auto imm = pi_->set_codom(codom)->immutabilize()) return const_pi_ = imm;
503 return const_pi_ = pi_;
504 }
505
506 mutable Pi* decl_ = nullptr;
507 mutable Pi* pi_ = nullptr;
508 mutable const Pi* const_pi_ = nullptr;
509
510 private:
511 Ptr<Ptrn> ptrn_;
512 mutable Ptr<IdPtrn> ret_;
513
514 friend class PiExpr;
515 };
516
517 PiExpr(Loc loc, Tok::Tag tag, Ptr<Dom>&& dom, Ptr<Expr>&& codom)
518 : Expr(loc)
519 , tag_(tag)
520 , dom_(std::move(dom))
521 , codom_(std::move(codom)) {}
522
523private:
524 Tok::Tag tag() const { return tag_; }
525 const Dom* dom() const { return dom_.get(); }
526 const Expr* codom() const { return codom_.get(); }
527
528 void bind(Scopes&) const override;
529 Ref emit_decl(Emitter&, Ref type) const override;
530 void emit_body(Emitter&, Ref decl) const override;
531 std::ostream& stream(Tab&, std::ostream&) const override;
532
533private:
534 Ref emit_(Emitter&) const override;
535
536 Tok::Tag tag_;
537 Ptr<Dom> dom_;
538 Ptr<Expr> codom_;
539};
540
541/// Wraps a LamDecl as Expr.
542class LamExpr : public Expr {
543public:
545
546 const LamDecl* lam() const { return lam_.get(); }
547
548 void bind(Scopes&) const override;
549 Ref emit_decl(Emitter&, Ref type) const override;
550 void emit_body(Emitter&, Ref decl) const override;
551 std::ostream& stream(Tab&, std::ostream&) const override;
552
553private:
554 Ref emit_(Emitter&) const override;
555
556 Ptr<LamDecl> lam_;
557};
558
559/// `callee arg`
560class AppExpr : public Expr {
561public:
563 : Expr(loc)
564 , is_explicit_(is_explicit)
565 , callee_(std::move(callee))
566 , arg_(std::move(arg)) {}
567
568 bool is_explicit() const { return is_explicit_; }
569 const Expr* callee() const { return callee_.get(); }
570 const Expr* arg() const { return arg_.get(); }
571
572 void bind(Scopes&) const override;
573 std::ostream& stream(Tab&, std::ostream&) const override;
574
575private:
576 Ref emit_(Emitter&) const override;
577
578 bool is_explicit_;
579 Ptr<Expr> callee_;
580 Ptr<Expr> arg_;
581};
582
583/// `ret ptrn = callee $ arg; body`
584class RetExpr : public Expr {
585public:
587 : Expr(loc)
588 , ptrn_(std::move(ptrn))
589 , callee_(std::move(callee))
590 , arg_(std::move(arg))
591 , body_(std::move(body)) {}
592
593 const Ptrn* ptrn() const { return ptrn_.get(); }
594 const Expr* callee() const { return callee_.get(); }
595 const Expr* arg() const { return arg_.get(); }
596 const Expr* body() const { return body_.get(); }
597
598 void bind(Scopes&) const override;
599 std::ostream& stream(Tab&, std::ostream&) const override;
600
601private:
602 Ref emit_(Emitter&) const override;
603
604 Ptr<Ptrn> ptrn_;
605 Ptr<Expr> callee_;
606 Ptr<Expr> arg_;
607 Ptr<Expr> body_;
608};
609// tuple
610
611/// Just wraps TuplePtrn as Expr.
612class SigmaExpr : public Expr {
613public:
615 : Expr(ptrn->loc())
616 , ptrn_(std::move(ptrn)) {}
617
618 const TuplePtrn* ptrn() const { return ptrn_.get(); }
619
620 void bind(Scopes&) const override;
621 Ref emit_decl(Emitter&, Ref type) const override;
622 void emit_body(Emitter&, Ref decl) const override;
623 std::ostream& stream(Tab&, std::ostream&) const override;
624
625private:
626 Ref emit_(Emitter&) const override;
627
628 Ptr<TuplePtrn> ptrn_;
629
631};
632
633/// `(elem_0, ..., elem_n-1)`
634class TupleExpr : public Expr {
635public:
637 : Expr(loc)
638 , elems_(std::move(elems)) {}
639
640 const auto& elems() const { return elems_; }
641 const Expr* elem(size_t i) const { return elems_[i].get(); }
642 size_t num_elems() const { return elems().size(); }
643
644 void bind(Scopes&) const override;
645 std::ostream& stream(Tab&, std::ostream&) const override;
646
647private:
648 Ref emit_(Emitter&) const override;
649
650 Ptrs<Expr> elems_;
651};
652
653/// `«dbg: shape; body»` or `‹dbg: shape; body›`
654template<bool arr> class ArrOrPackExpr : public Expr {
655public:
657 : Expr(loc)
658 , shape_(std::move(shape))
659 , body_(std::move(body)) {}
660
661 const IdPtrn* shape() const { return shape_.get(); }
662 const Expr* body() const { return body_.get(); }
663
664 void bind(Scopes&) const override;
665 std::ostream& stream(Tab&, std::ostream&) const override;
666
667private:
668 Ref emit_(Emitter&) const override;
669
670 Ptr<IdPtrn> shape_;
671 Ptr<Expr> body_;
672};
673
676
677/// `tuple#index`
678class ExtractExpr : public Expr {
679public:
681 : Expr(loc)
682 , tuple_(std::move(tuple))
683 , index_(std::move(index)) {}
685 : Expr(loc)
686 , tuple_(std::move(tuple))
687 , index_(index) {}
688
689 const Expr* tuple() const { return tuple_.get(); }
690 const auto& index() const { return index_; }
691 const Decl* decl() const { return decl_; }
692
693 void bind(Scopes&) const override;
694 std::ostream& stream(Tab&, std::ostream&) const override;
695
696private:
697 Ref emit_(Emitter&) const override;
698
699 Ptr<Expr> tuple_;
700 std::variant<Ptr<Expr>, Dbg> index_;
701 mutable const Decl* decl_ = nullptr;
702};
703
704/// `ins(tuple, index, value)`
705class InsertExpr : public Expr {
706public:
708 : Expr(loc)
709 , tuple_(std::move(tuple))
710 , index_(std::move(index))
711 , value_(std::move(value)) {}
712
713 const Expr* tuple() const { return tuple_.get(); }
714 const Expr* index() const { return index_.get(); }
715 const Expr* value() const { return value_.get(); }
716
717 void bind(Scopes&) const override;
718 std::ostream& stream(Tab&, std::ostream&) const override;
719
720private:
721 Ref emit_(Emitter&) const override;
722
723 Ptr<Expr> tuple_;
724 Ptr<Expr> index_;
725 Ptr<Expr> value_;
726};
727
728/// `⦃ expr ⦄`
729class UniqExpr : public Expr {
730public:
731 UniqExpr(Loc loc, Ptr<Expr>&& expr)
732 : Expr(loc)
733 , inhabitant_(std::move(expr)) {}
734
735 const Expr* inhabitant() const { return inhabitant_.get(); }
736
737 void bind(Scopes&) const override;
738 std::ostream& stream(Tab&, std::ostream&) const override;
739
740private:
741 Ref emit_(Emitter&) const override;
742
743 Ptr<Expr> inhabitant_;
744};
745
746/*
747 * Decls
748 */
749
750/// `let ptrn: type = value;`
751class LetDecl : public ValDecl {
752public:
754 : ValDecl(loc)
755 , ptrn_(std::move(ptrn))
756 , value_(std::move(value)) {}
757
758 const Ptrn* ptrn() const { return ptrn_.get(); }
759 const Expr* value() const { return value_.get(); }
760
761 void bind(Scopes&) const override;
762 void emit(Emitter&) const override;
763 std::ostream& stream(Tab&, std::ostream&) const override;
764
765private:
766 Ptr<Ptrn> ptrn_;
767 Ptr<Expr> value_;
768 mutable AnnexInfo* annex_ = nullptr;
769 mutable sub_t sub_ = 0;
770};
771
772/// `axm ptrn: type = value;`
773class AxiomDecl : public ValDecl {
774public:
775 class Alias : public Decl {
776 public:
778 : Decl(dbg.loc())
779 , dbg_(dbg) {}
780
781 Dbg dbg() const { return dbg_; }
782
783 void bind(Scopes&, const AxiomDecl*) const;
784 std::ostream& stream(Tab&, std::ostream&) const override;
785
786 private:
787 Dbg dbg_;
788 mutable Dbg full_;
789
790 friend class AxiomDecl;
791 };
792
794 : ValDecl(loc)
795 , dbg_(dbg)
796 , subs_(std::move(subs))
797 , type_(std::move(type))
798 , normalizer_(normalizer)
799 , curry_(curry)
800 , trip_(trip) {}
801
802 Dbg dbg() const { return dbg_; }
803 const auto& subs() const { return subs_; }
804 size_t num_subs() const { return subs_.size(); }
805 const auto& sub(size_t i) const { return subs_[i]; }
806 const Expr* type() const { return type_.get(); }
807 Dbg normalizer() const { return normalizer_; }
808 Tok curry() const { return curry_; }
809 Tok trip() const { return trip_; }
810
811 void bind(Scopes&) const override;
812 void emit(Emitter&) const override;
813 std::ostream& stream(Tab&, std::ostream&) const override;
814
815private:
816 Dbg dbg_;
817 std::deque<Ptrs<Alias>> subs_;
818 Ptr<Expr> type_;
819 Dbg normalizer_;
820 Tok curry_, trip_;
821 mutable AnnexInfo* annex_ = nullptr;
822 mutable Ref mim_type_;
823};
824
825/// `.rec dbg: type = body`
826class RecDecl : public ValDecl {
827public:
829 : ValDecl(loc)
830 , dbg_(dbg)
831 , type_(std::move(type))
832 , body_(std::move(body))
833 , next_(std::move(next)) {}
834
835 Dbg dbg() const { return dbg_; }
836 const Expr* type() const { return type_.get(); }
837 const Expr* body() const { return body_.get(); }
838 const RecDecl* next() const { return next_.get(); }
839
840 void bind(Scopes&) const override;
841 virtual void bind_decl(Scopes&) const;
842 virtual void bind_body(Scopes&) const;
843
844 void emit(Emitter&) const override;
845 virtual void emit_decl(Emitter&) const;
846 virtual void emit_body(Emitter&) const;
847
848 std::ostream& stream(Tab&, std::ostream&) const override;
849
850private:
851 Dbg dbg_;
852 Ptr<Expr> type_;
853 Ptr<Expr> body_;
854 Ptr<RecDecl> next_;
855 mutable AnnexInfo* annex_ = nullptr;
856 mutable sub_t sub_ = 0;
857};
858
859/// One of:
860/// * `λ dom_0 ... dom_n-1 -> codom`
861/// * `cn dom_0 ... dom_n-1`
862/// * `fn dom_0 ... dom_n-1 -> codom`
863/// * `lam dbg dom_0 ... dom_n-1 -> codom`
864/// * `con dbg dom_0 ... dom_n-1`
865/// * `fun dbg dom_0 ... dom_n-1 -> codom`
866class LamDecl : public RecDecl {
867public:
868 class Dom : public PiExpr::Dom {
869 public:
871 : PiExpr::Dom(loc, std::move(ptrn))
872 , filter_(std::move(filter)) {}
873
874 bool is_implicit() const { return ptrn()->is_implicit(); }
875 const Expr* filter() const { return filter_.get(); }
876
877 void bind(Scopes& scopes, bool quiet = false) const override;
878 Lam* emit_value(Emitter&) const;
879 std::ostream& stream(Tab&, std::ostream&) const override;
880
881 private:
882 Ptr<Expr> filter_;
883 mutable Lam* lam_;
884
885 friend class LamDecl;
886 };
887
890 bool is_external,
891 Dbg dbg,
892 Ptrs<Dom>&& doms,
894 Ptr<Expr>&& body,
896 : RecDecl(loc, dbg, nullptr, std::move(body), std::move(next))
897 , tag_(tag)
898 , is_external_(is_external)
899 , doms_(std::move(doms))
900 , codom_(std::move(codom)) {
901 assert(num_doms() != 0);
902 }
903
904 Tok::Tag tag() const { return tag_; }
905 bool is_external() const { return is_external_; }
906 const Ptrs<Dom>& doms() const { return doms_; }
907 const Dom* dom(size_t i) const { return doms_[i].get(); }
908 size_t num_doms() const { return doms_.size(); }
909 const Expr* codom() const { return codom_.get(); }
910
911 void bind_decl(Scopes&) const override;
912 void bind_body(Scopes&) const override;
913 void emit_decl(Emitter&) const override;
914 void emit_body(Emitter&) const override;
915 std::ostream& stream(Tab&, std::ostream&) const override;
916
917private:
918 Tok::Tag tag_;
919 bool is_external_;
920 Ptrs<Dom> doms_;
921 Ptr<Expr> codom_;
922 mutable AnnexInfo* annex_ = nullptr;
923 mutable sub_t sub_ = 0;
924};
925
926/// `cfun dbg dom -> codom`
927class CDecl : public ValDecl {
928public:
930 : ValDecl(loc)
931 , tag_(tag)
932 , dbg_(dbg)
933 , dom_(std::move(dom))
934 , codom_(std::move(codom)) {}
935
936 Dbg dbg() const { return dbg_; }
937 Tok::Tag tag() const { return tag_; }
938 const Ptrn* dom() const { return dom_.get(); }
939 const Expr* codom() const { return codom_.get(); }
940
941 void bind(Scopes&) const override;
942 void emit(Emitter&) const override;
943 std::ostream& stream(Tab&, std::ostream&) const override;
944
945private:
946 Tok::Tag tag_;
947 Dbg dbg_;
948 Ptr<Ptrn> dom_;
949 Ptr<Expr> codom_;
950};
951
952/*
953 * Module
954 */
955
956class Import : public Node {
957public:
959 : Node(loc)
960 , dbg_(dbg)
961 , tag_(tag)
962 , module_(std::move(module)) {}
963
964 Dbg dbg() const { return dbg_; }
965 Tok::Tag tag() const { return tag_; }
966 const Module* module() const { return module_.get(); }
967
968 void bind(Scopes&) const;
969 void emit(Emitter&) const;
970 std::ostream& stream(Tab&, std::ostream&) const;
971
972 friend void swap(Import& i1, Import& i2) noexcept {
973 using std::swap;
974 swap(i1.dbg_, i2.dbg_);
975 swap(i1.tag_, i2.tag_);
976 swap(i1.module_, i2.module_);
977 }
978
979private:
980 Dbg dbg_;
981 Tok::Tag tag_;
982 Ptr<Module> module_;
983};
984
985class Module : public Node {
986public:
988 : Node(loc)
989 , imports_(std::move(imports))
990 , decls_(std::move(decls)) {}
991
992 const auto& implicit_imports() const { return implicit_imports_; }
993 const auto& imports() const { return imports_; }
994 const auto& decls() const { return decls_; }
995
996 void add_implicit_imports(Ptrs<Import>&& imports) const { implicit_imports_ = std::move(imports); }
997
998 void compile(AST&) const;
999 void bind(AST&) const;
1000 void bind(Scopes&) const;
1001 void emit(AST&) const;
1002 void emit(Emitter&) const;
1003 std::ostream& stream(Tab&, std::ostream&) const override;
1004
1005private:
1006 mutable Ptrs<Import> implicit_imports_;
1007 Ptrs<Import> imports_;
1008 Ptrs<ValDecl> decls_;
1009};
1010
1013 return load_plugins(w, Vector<Sym>(plugins.size(), [&](size_t i) { return w.sym(plugins[i]); }));
1014}
1015inline AST load_plugins(World& w, Sym sym) { return load_plugins(w, View<Sym>({sym})); }
1016inline AST load_plugins(World& w, const std::string& plugin) { return load_plugins(w, w.sym(plugin)); }
1017
1018} // 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:105
A dependent function type.
Definition lam.h:11
Pi * set_codom(Ref codom)
Definition lam.h:76
const Pi * immutabilize() override
Tries to make an immutable from a mutable.
Definition def.cpp:170
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: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
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:560
AppExpr(Loc loc, bool is_explicit, Ptr< Expr > &&callee, Ptr< Expr > &&arg)
Definition ast.h:562
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:568
const Expr * arg() const
Definition ast.h:570
const Expr * callee() const
Definition ast.h:569
Ref emit_(Emitter &) const override
Definition emit.cpp:247
«dbg: shape; body» or ‹dbg: shape; body›
Definition ast.h:654
const Expr * body() const
Definition ast.h:662
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:138
ArrOrPackExpr(Loc loc, Ptr< IdPtrn > &&shape, Ptr< Expr > &&body)
Definition ast.h:656
const IdPtrn * shape() const
Definition ast.h:661
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:773
const auto & subs() const
Definition ast.h:803
Tok curry() const
Definition ast.h:808
size_t num_subs() const
Definition ast.h:804
AxiomDecl(Loc loc, Dbg dbg, std::deque< Ptrs< Alias > > &&subs, Ptr< Expr > &&type, Dbg normalizer, Tok curry, Tok trip)
Definition ast.h:793
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:806
void emit(Emitter &) const override
Definition emit.cpp:343
Dbg dbg() const
Definition ast.h:802
Dbg normalizer() const
Definition ast.h:807
Tok trip() const
Definition ast.h:809
const auto & sub(size_t i) const
Definition ast.h:805
cfun dbg dom -> codom
Definition ast.h:927
Tok::Tag tag() const
Definition ast.h:937
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
Definition ast.h:929
const Ptrn * dom() const
Definition ast.h:938
void emit(Emitter &) const override
Definition emit.cpp:460
const Expr * codom() const
Definition ast.h:939
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:213
Dbg dbg() const
Definition ast.h:936
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:678
const Decl * decl() const
Definition ast.h:691
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:145
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index)
Definition ast.h:680
const auto & index() const
Definition ast.h:690
const Expr * tuple() const
Definition ast.h:689
void bind(Scopes &) const override
Definition bind.cpp:198
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Dbg index)
Definition ast.h:684
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:972
Import(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Module > &&module)
Definition ast.h:958
void bind(Scopes &) const
Definition bind.cpp:88
Dbg dbg() const
Definition ast.h:964
void emit(Emitter &) const
Definition emit.cpp:47
Tok::Tag tag() const
Definition ast.h:965
const Module * module() const
Definition ast.h:966
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:705
Ref emit_(Emitter &) const override
Definition emit.cpp:330
InsertExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index, Ptr< Expr > &&value)
Definition ast.h:707
const Expr * index() const
Definition ast.h:714
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:713
const Expr * value() const
Definition ast.h:715
Lam * emit_value(Emitter &) const
Definition emit.cpp:414
const Expr * filter() const
Definition ast.h:875
bool is_implicit() const
Definition ast.h:874
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:189
Dom(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&filter)
Definition ast.h:870
void bind(Scopes &scopes, bool quiet=false) const override
Definition bind.cpp:285
One of:
Definition ast.h:866
Tok::Tag tag() const
Definition ast.h:904
void bind_body(Scopes &) const override
Definition bind.cpp:320
bool is_external() const
Definition ast.h:905
const Ptrs< Dom > & doms() const
Definition ast.h:906
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:196
const Expr * codom() const
Definition ast.h:909
void emit_decl(Emitter &) const override
Definition emit.cpp:428
size_t num_doms() const
Definition ast.h:908
void emit_body(Emitter &) const override
Definition emit.cpp:454
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:888
const Dom * dom(size_t i) const
Definition ast.h:907
Wraps a LamDecl as Expr.
Definition ast.h:542
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:546
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:124
let ptrn: type = value;
Definition ast.h:751
void bind(Scopes &) const override
Definition bind.cpp:257
const Expr * value() const
Definition ast.h:759
const Ptrn * ptrn() const
Definition ast.h:758
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:179
LetDecl(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&value)
Definition ast.h:753
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:987
const auto & decls() const
Definition ast.h:994
void emit(AST &) const
Definition emit.cpp:35
const auto & implicit_imports() const
Definition ast.h:992
void bind(AST &) const
Definition bind.cpp:77
const auto & imports() const
Definition ast.h:993
void compile(AST &) const
Definition ast.cpp:183
void add_implicit_imports(Ptrs< Import > &&imports) const
Definition ast.h:996
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
const Pi * const_pi_
Definition ast.h:508
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
Definition ast.h:483
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:112
const Pi * set_codom(Ref codom) const
Definition ast.h:501
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:517
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:826
void emit(Emitter &) const override
Definition emit.cpp:397
Dbg dbg() const
Definition ast.h:835
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:828
virtual void bind_decl(Scopes &) const
Definition bind.cpp:272
const Expr * body() const
Definition ast.h:837
const Expr * type() const
Definition ast.h:836
const RecDecl * next() const
Definition ast.h:838
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:584
const Ptrn * ptrn() const
Definition ast.h:593
Ref emit_(Emitter &) const override
Definition emit.cpp:253
const Expr * arg() const
Definition ast.h:595
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
Definition ast.h:586
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:596
const Expr * callee() const
Definition ast.h:594
Just wraps TuplePtrn as Expr.
Definition ast.h:612
const TuplePtrn * ptrn() const
Definition ast.h:618
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:614
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:634
const Expr * elem(size_t i) const
Definition ast.h:641
void bind(Scopes &) const override
Definition bind.cpp:184
TupleExpr(Loc loc, Ptrs< Expr > &&elems)
Definition ast.h:636
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:640
size_t num_elems() const
Definition ast.h:642
(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:729
const Expr * inhabitant() const
Definition ast.h:735
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:731
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