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 struct {
33 Sym plugin, tag;
34 } sym;
35 struct {
37 tag_t tag;
38 uint8_t curry, trip;
39 } id;
40 std::deque<std::deque<Sym>> subs; ///< List of subs which is a list of aliases.
42 std::optional<bool> pi;
43 bool fresh = true;
44};
45
46class AST {
47public:
48 AST() = default;
50 : world_(&world) {}
51 AST(AST&& other)
52 : AST() {
53 swap(*this, other);
54 }
55 ~AST();
56
57 /// @name Getters
58 ///@{
59 World& world() { return *world_; }
60 Driver& driver() { return world().driver(); }
61 Error& error() { return err_; }
62 const Error& error() const { return err_; }
63 ///@}
64
65 /// @name Sym
66 ///@{
67 Sym sym(const char* s) { return driver().sym(s); }
68 Sym sym(std::string_view s) { return driver().sym(s); }
69 Sym sym(const std::string& s) { return driver().sym(s); }
70 Sym sym_anon() { return sym("_"); } ///< `"_"`.
71 Sym sym_return() { return sym("return"); } ///< `"return"`.
72 Sym sym_error() { return sym("_error_"); } ///< `"_error_"`.
73 ///@}
74
75 template<class T, class... Args> auto ptr(Args&&... args) {
76 return arena_.mk<const T>(std::forward<Args&&>(args)...);
77 }
78
79 /// @name Formatted Output
80 ///@{
81 // clang-format off
82 template<class... Args> Error& error(Loc loc, const char* fmt, Args&&... args) const { return err_.error(loc, fmt, std::forward<Args&&>(args)...); }
83 template<class... Args> Error& warn (Loc loc, const char* fmt, Args&&... args) const { return err_.warn (loc, fmt, std::forward<Args&&>(args)...); }
84 template<class... Args> Error& note (Loc loc, const char* fmt, Args&&... args) const { return err_.note (loc, fmt, std::forward<Args&&>(args)...); }
85 // clang-format on
86 ///@}
87
88 /// @name Manage Annex
89 ///@{
91 const auto& plugin2annexes(Sym plugin) { return plugin2sym2annex_[plugin]; }
92 ///@}
93
94 void bootstrap(Sym plugin, std::ostream& h);
95
96 friend void swap(AST& a1, AST& a2) noexcept {
97 using std::swap;
98 // clang-format off
99 swap(a1.world_, a2.world_);
100 swap(a1.arena_, a2.arena_);
101 swap(a1.err_, a2.err_);
102 // clang-format on
103 }
104
105private:
106 World* world_ = nullptr;
107 fe::Arena arena_;
108 mutable Error err_;
109 absl::node_hash_map<fe::Sym, absl::node_hash_map<fe::Sym, AnnexInfo>> plugin2sym2annex_;
110};
111
112class Node : public fe::RuntimeCast<Node> {
113protected:
115 : loc_(loc) {}
116 virtual ~Node() {}
117
118public:
119 Loc loc() const { return loc_; }
120
121 virtual std::ostream& stream(Tab&, std::ostream&) const = 0;
122 void dump() const;
123
124private:
125 Loc loc_;
126};
127
128class Expr : public Node {
129protected:
131 : Node(loc) {}
132
133public:
134 /// @name Precedence
135 ///@{
148
149 static constexpr bool is_rassoc(Prec p) { return p == Prec::Arrow; }
150 ///@}
151
152 const Def* emit(Emitter&) const;
153 virtual void bind(Scopes&) const = 0;
154 virtual const Def* emit_decl(Emitter&, const Def* /*type*/) const { fe::unreachable(); }
155 virtual void emit_body(Emitter&, const Def* /*decl*/) const { fe::unreachable(); }
156
157private:
158 virtual const Def* emit_(Emitter&) const = 0;
159};
160
161class Decl : public Node {
162protected:
164 : Node(loc) {}
165
166public:
167 const Def* def() const { return def_; }
168
169protected:
170 mutable const Def* 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 const Def* emit_value(Emitter&, const Def*) const = 0;
196 virtual const Def* 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 const Def* emit_value(Emitter&, const Def*) const override;
209 const Def* 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 const Def* emit_value(Emitter&, const Def*) const override;
235 const Def* 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 const Def* emit_value(Emitter&, const Def*) const override;
256 const Def* 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 const Def* emit_value(Emitter&, const Def*) const override;
278 const Def* 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 const Def* emit_value(Emitter&, const Def*) const override;
306 const Def* emit_type(Emitter&) const override;
307 const Def* emit_decl(Emitter&, const Def* type) const;
308 const Def* emit_body(Emitter&, const Def* 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 const Def* emit_(Emitter&) const override;
330};
331
332class HoleExpr : 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 const Def* 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 const Def* 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 const Def* 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 const Def* 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 const Def* 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 const Def* emit_(Emitter&) const override;
444
445 Ptr<Expr> level_;
446};
447
448// union
449
450/// `t1 ∪ t2`
451class UnionExpr : public Expr {
452public:
454 : Expr(loc)
455 , types_(std::move(types)) {}
456
457 const auto& types() const { return types_; }
458
459 void bind(Scopes&) const override;
460 std::ostream& stream(Tab&, std::ostream&) const override;
461
462private:
463 const Def* emit_(Emitter&) const override;
464
465 Ptrs<Expr> types_;
466};
467
468// injection
469
470/// `value inj t1 ∪ t2`
471class InjExpr : public Expr {
472public:
474 : Expr(loc)
475 , value_(std::move(value))
476 , type_(std::move(type)) {}
477
478 const Expr* value() const { return value_.get(); }
479 const Expr* type() const { return type_.get(); }
480
481 void bind(Scopes&) const override;
482 std::ostream& stream(Tab&, std::ostream&) const override;
483
484private:
485 const Def* emit_(Emitter&) const override;
486
487 Ptr<Expr> value_;
488 Ptr<Expr> type_;
489};
490
491// matching for destruction of sum types
492
493// n-ary match
494class MatchExpr : public Expr {
495public:
496 class Arm : public Node {
497 public:
499 : Node(loc)
500 , ptrn_(std::move(ptrn))
501 , body_(std::move(body)) {}
502
503 const Ptrn* ptrn() const { return ptrn_.get(); }
504 const Expr* body() const { return body_.get(); }
505
506 virtual void bind(Scopes&) const;
507 Lam* emit(Emitter&) const;
508 std::ostream& stream(Tab&, std::ostream&) const override;
509
510 private:
511 Ptr<Ptrn> ptrn_;
512 Ptr<Expr> body_;
513 };
514
516 : Expr(loc)
517 , scrutinee_(std::move(scrutinee))
518 , arms_(std::move(arms)) {}
519
520 const Expr* scrutinee() const { return scrutinee_.get(); }
521 const auto& arms() const { return arms_; }
522 const Arm* arm(size_t i) const { return arms_[i].get(); }
523 size_t num_arms() const { return arms_.size(); }
524
525 void bind(Scopes&) const override;
526 std::ostream& stream(Tab&, std::ostream&) const override;
527
528private:
529 const Def* emit_(Emitter&) const override;
530
531 Ptr<Expr> scrutinee_;
532 Ptrs<Arm> arms_;
533};
534
535// lam
536
537/// `dom -> codom`
538class ArrowExpr : public Expr {
539public:
540 ArrowExpr(Loc loc, Ptr<Expr>&& dom, Ptr<Expr>&& codom)
541 : Expr(loc)
542 , dom_(std::move(dom))
543 , codom_(std::move(codom)) {}
544
545private:
546 const Expr* dom() const { return dom_.get(); }
547 const Expr* codom() const { return codom_.get(); }
548
549 void bind(Scopes&) const override;
550 const Def* emit_decl(Emitter&, const Def* type) const override;
551 void emit_body(Emitter&, const Def* decl) const override;
552 std::ostream& stream(Tab&, std::ostream&) const override;
553
554private:
555 const Def* emit_(Emitter&) const override;
556
557 Ptr<Expr> dom_;
558 Ptr<Expr> codom_;
559 mutable Pi* decl_ = nullptr;
560};
561
562/// One of:
563/// * ` {ptrn} → codom`
564/// * `Cn prn`
565/// * `Fn prn → codom`
566class PiExpr : public Expr {
567public:
568 class Dom : public Node {
569 public:
571 : Node(loc)
572 , ptrn_(std::move(ptrn)) {}
573
574 bool is_implicit() const { return ptrn_->is_implicit(); }
575 const Ptrn* ptrn() const { return ptrn_.get(); }
576 const IdPtrn* ret() const { return ret_.get(); }
577
578 void add_ret(AST& ast, Ptr<Expr>&& type) const {
579 auto loc = type->loc();
580 ret_ = ast.ptr<IdPtrn>(loc, Dbg(loc, ast.sym_return()), std::move(type));
581 }
582
583 virtual void bind(Scopes&, bool quiet = false) const;
584 virtual void emit_type(Emitter&) const;
585 std::ostream& stream(Tab&, std::ostream&) const override;
586
587 protected:
588 mutable Pi* decl_ = nullptr;
589 mutable Pi* pi_ = nullptr;
590
591 private:
592 Ptr<Ptrn> ptrn_;
593 mutable Ptr<IdPtrn> ret_;
594
595 friend class PiExpr;
596 };
597
598 PiExpr(Loc loc, Tok::Tag tag, Ptr<Dom>&& dom, Ptr<Expr>&& codom)
599 : Expr(loc)
600 , tag_(tag)
601 , dom_(std::move(dom))
602 , codom_(std::move(codom)) {}
603
604private:
605 Tok::Tag tag() const { return tag_; }
606 const Dom* dom() const { return dom_.get(); }
607 const Expr* codom() const { return codom_.get(); }
608
609 void bind(Scopes&) const override;
610 const Def* emit_decl(Emitter&, const Def* type) const override;
611 void emit_body(Emitter&, const Def* decl) const override;
612 std::ostream& stream(Tab&, std::ostream&) const override;
613
614private:
615 const Def* emit_(Emitter&) const override;
616
617 Tok::Tag tag_;
618 Ptr<Dom> dom_;
619 Ptr<Expr> codom_;
620};
621
622/// Wraps a LamDecl as Expr.
623class LamExpr : public Expr {
624public:
626
627 const LamDecl* lam() const { return lam_.get(); }
628
629 void bind(Scopes&) const override;
630 const Def* emit_decl(Emitter&, const Def* type) const override;
631 void emit_body(Emitter&, const Def* decl) const override;
632 std::ostream& stream(Tab&, std::ostream&) const override;
633
634private:
635 const Def* emit_(Emitter&) const override;
636
637 Ptr<LamDecl> lam_;
638};
639
640/// `callee arg`
641class AppExpr : public Expr {
642public:
644 : Expr(loc)
645 , is_explicit_(is_explicit)
646 , callee_(std::move(callee))
647 , arg_(std::move(arg)) {}
648
649 bool is_explicit() const { return is_explicit_; }
650 const Expr* callee() const { return callee_.get(); }
651 const Expr* arg() const { return arg_.get(); }
652
653 void bind(Scopes&) const override;
654 std::ostream& stream(Tab&, std::ostream&) const override;
655
656private:
657 const Def* emit_(Emitter&) const override;
658
659 bool is_explicit_;
660 Ptr<Expr> callee_;
661 Ptr<Expr> arg_;
662};
663
664/// `ret ptrn = callee $ arg; body`
665class RetExpr : public Expr {
666public:
668 : Expr(loc)
669 , ptrn_(std::move(ptrn))
670 , callee_(std::move(callee))
671 , arg_(std::move(arg))
672 , body_(std::move(body)) {}
673
674 const Ptrn* ptrn() const { return ptrn_.get(); }
675 const Expr* callee() const { return callee_.get(); }
676 const Expr* arg() const { return arg_.get(); }
677 const Expr* body() const { return body_.get(); }
678
679 void bind(Scopes&) const override;
680 std::ostream& stream(Tab&, std::ostream&) const override;
681
682private:
683 const Def* emit_(Emitter&) const override;
684
685 Ptr<Ptrn> ptrn_;
686 Ptr<Expr> callee_;
687 Ptr<Expr> arg_;
688 Ptr<Expr> body_;
689};
690// tuple
691
692/// Just wraps TuplePtrn as Expr.
693class SigmaExpr : public Expr {
694public:
696 : Expr(ptrn->loc())
697 , ptrn_(std::move(ptrn)) {}
698
699 const TuplePtrn* ptrn() const { return ptrn_.get(); }
700
701 void bind(Scopes&) const override;
702 const Def* emit_decl(Emitter&, const Def* type) const override;
703 void emit_body(Emitter&, const Def* decl) const override;
704 std::ostream& stream(Tab&, std::ostream&) const override;
705
706private:
707 const Def* emit_(Emitter&) const override;
708
709 Ptr<TuplePtrn> ptrn_;
710
712};
713
714/// `(elem_0, ..., elem_n-1)`
715class TupleExpr : public Expr {
716public:
718 : Expr(loc)
719 , elems_(std::move(elems)) {}
720
721 const auto& elems() const { return elems_; }
722 const Expr* elem(size_t i) const { return elems_[i].get(); }
723 size_t num_elems() const { return elems().size(); }
724
725 void bind(Scopes&) const override;
726 std::ostream& stream(Tab&, std::ostream&) const override;
727
728private:
729 const Def* emit_(Emitter&) const override;
730
731 Ptrs<Expr> elems_;
732};
733
734/// `«dbg: shape; body»` or `‹dbg: shape; body›`
735class SeqExpr : public Expr {
736public:
738 : Expr(loc)
739 , is_arr_(is_arr)
740 , shape_(std::move(shape))
741 , body_(std::move(body)) {}
742
743 bool is_arr() const { return is_arr_; }
744 const IdPtrn* shape() const { return shape_.get(); }
745 const Expr* body() const { return body_.get(); }
746
747 void bind(Scopes&) const override;
748 std::ostream& stream(Tab&, std::ostream&) const override;
749
750private:
751 const Def* emit_(Emitter&) const override;
752
753 bool is_arr_;
754 Ptr<IdPtrn> shape_;
755 Ptr<Expr> body_;
756};
757
758/// `tuple#index`
759class ExtractExpr : public Expr {
760public:
762 : Expr(loc)
763 , tuple_(std::move(tuple))
764 , index_(std::move(index)) {}
766 : Expr(loc)
767 , tuple_(std::move(tuple))
768 , index_(index) {}
769
770 const Expr* tuple() const { return tuple_.get(); }
771 const auto& index() const { return index_; }
772 const Decl* decl() const { return decl_; }
773
774 void bind(Scopes&) const override;
775 std::ostream& stream(Tab&, std::ostream&) const override;
776
777private:
778 const Def* emit_(Emitter&) const override;
779
780 Ptr<Expr> tuple_;
781 std::variant<Ptr<Expr>, Dbg> index_;
782 mutable const Decl* decl_ = nullptr;
783};
784
785/// `ins(tuple, index, value)`
786class InsertExpr : public Expr {
787public:
789 : Expr(loc)
790 , tuple_(std::move(tuple))
791 , index_(std::move(index))
792 , value_(std::move(value)) {}
793
794 const Expr* tuple() const { return tuple_.get(); }
795 const Expr* index() const { return index_.get(); }
796 const Expr* value() const { return value_.get(); }
797
798 void bind(Scopes&) const override;
799 std::ostream& stream(Tab&, std::ostream&) const override;
800
801private:
802 const Def* emit_(Emitter&) const override;
803
804 Ptr<Expr> tuple_;
805 Ptr<Expr> index_;
806 Ptr<Expr> value_;
807};
808
809/// `⦃ expr ⦄`
810class UniqExpr : public Expr {
811public:
812 UniqExpr(Loc loc, Ptr<Expr>&& expr)
813 : Expr(loc)
814 , inhabitant_(std::move(expr)) {}
815
816 const Expr* inhabitant() const { return inhabitant_.get(); }
817
818 void bind(Scopes&) const override;
819 std::ostream& stream(Tab&, std::ostream&) const override;
820
821private:
822 const Def* emit_(Emitter&) const override;
823
824 Ptr<Expr> inhabitant_;
825};
826
827/*
828 * Decls
829 */
830
831/// `let ptrn: type = value;`
832class LetDecl : public ValDecl {
833public:
835 : ValDecl(loc)
836 , ptrn_(std::move(ptrn))
837 , value_(std::move(value)) {}
838
839 const Ptrn* ptrn() const { return ptrn_.get(); }
840 const Expr* value() const { return value_.get(); }
841
842 void bind(Scopes&) const override;
843 void emit(Emitter&) const override;
844 std::ostream& stream(Tab&, std::ostream&) const override;
845
846private:
847 Ptr<Ptrn> ptrn_;
848 Ptr<Expr> value_;
849 mutable AnnexInfo* annex_ = nullptr;
850 mutable sub_t sub_ = 0;
851};
852
853/// `axm ptrn: type = value;`
854class AxmDecl : public ValDecl {
855public:
856 class Alias : public Decl {
857 public:
859 : Decl(dbg.loc())
860 , dbg_(dbg) {}
861
862 Dbg dbg() const { return dbg_; }
863
864 void bind(Scopes&, const AxmDecl*) const;
865 std::ostream& stream(Tab&, std::ostream&) const override;
866
867 private:
868 Dbg dbg_;
869 mutable Dbg full_;
870
871 friend class AxmDecl;
872 };
873
875 : ValDecl(loc)
876 , dbg_(dbg)
877 , subs_(std::move(subs))
878 , type_(std::move(type))
879 , normalizer_(normalizer)
880 , curry_(curry)
881 , trip_(trip) {}
882
883 Dbg dbg() const { return dbg_; }
884 const auto& subs() const { return subs_; }
885 size_t num_subs() const { return subs_.size(); }
886 const auto& sub(size_t i) const { return subs_[i]; }
887 const Expr* type() const { return type_.get(); }
888 Dbg normalizer() const { return normalizer_; }
889 Tok curry() const { return curry_; }
890 Tok trip() const { return trip_; }
891
892 void bind(Scopes&) const override;
893 void emit(Emitter&) const override;
894 std::ostream& stream(Tab&, std::ostream&) const override;
895
896private:
897 Dbg dbg_;
898 std::deque<Ptrs<Alias>> subs_;
899 Ptr<Expr> type_;
900 Dbg normalizer_;
901 Tok curry_, trip_;
902 mutable sub_t offset_;
903 mutable AnnexInfo* annex_ = nullptr;
904 mutable const Def* mim_type_;
905};
906
907/// `.rec dbg: type = body`
908class RecDecl : public ValDecl {
909public:
911 : ValDecl(loc)
912 , dbg_(dbg)
913 , type_(std::move(type))
914 , body_(std::move(body))
915 , next_(std::move(next)) {}
916
917 Dbg dbg() const { return dbg_; }
918 const Expr* type() const { return type_.get(); }
919 const Expr* body() const { return body_.get(); }
920 const RecDecl* next() const { return next_.get(); }
921
922 void bind(Scopes&) const override;
923 virtual void bind_decl(Scopes&) const;
924 virtual void bind_body(Scopes&) const;
925
926 void emit(Emitter&) const override;
927 virtual void emit_decl(Emitter&) const;
928 virtual void emit_body(Emitter&) const;
929
930 std::ostream& stream(Tab&, std::ostream&) const override;
931
932private:
933 Dbg dbg_;
934 Ptr<Expr> type_;
935 Ptr<Expr> body_;
936 Ptr<RecDecl> next_;
937 mutable AnnexInfo* annex_ = nullptr;
938 mutable sub_t sub_ = 0;
939};
940
941/// One of:
942/// * `λ dom_0 ... dom_n-1 -> codom`
943/// * `cn dom_0 ... dom_n-1`
944/// * `fn dom_0 ... dom_n-1 -> codom`
945/// * `lam dbg dom_0 ... dom_n-1 -> codom`
946/// * `con dbg dom_0 ... dom_n-1`
947/// * `fun dbg dom_0 ... dom_n-1 -> codom`
948class LamDecl : public RecDecl {
949public:
950 class Dom : public PiExpr::Dom {
951 public:
953 : PiExpr::Dom(loc, std::move(ptrn))
954 , filter_(std::move(filter)) {}
955
956 bool is_implicit() const { return ptrn()->is_implicit(); }
957 const Expr* filter() const { return filter_.get(); }
958
959 void bind(Scopes&, bool quiet = false) const override;
960 Lam* emit_value(Emitter&) const;
961 std::ostream& stream(Tab&, std::ostream&) const override;
962
963 private:
964 Ptr<Expr> filter_;
965 mutable Lam* lam_;
966
967 friend class LamDecl;
968 };
969
972 bool is_external,
973 Dbg dbg,
974 Ptrs<Dom>&& doms,
976 Ptr<Expr>&& body,
978 : RecDecl(loc, dbg, nullptr, std::move(body), std::move(next))
979 , tag_(tag)
980 , is_external_(is_external)
981 , doms_(std::move(doms))
982 , codom_(std::move(codom)) {
983 assert(num_doms() != 0);
984 }
985
986 Tok::Tag tag() const { return tag_; }
987 bool is_external() const { return is_external_; }
988 const Ptrs<Dom>& doms() const { return doms_; }
989 const Dom* dom(size_t i) const { return doms_[i].get(); }
990 size_t num_doms() const { return doms_.size(); }
991 const Expr* codom() const { return codom_.get(); }
992
993 void bind_decl(Scopes&) const override;
994 void bind_body(Scopes&) const override;
995 void emit_decl(Emitter&) const override;
996 void emit_body(Emitter&) const override;
997 std::ostream& stream(Tab&, std::ostream&) const override;
998
999private:
1000 Tok::Tag tag_;
1001 bool is_external_;
1002 Ptrs<Dom> doms_;
1003 Ptr<Expr> codom_;
1004 mutable AnnexInfo* annex_ = nullptr;
1005 mutable sub_t sub_ = 0;
1006};
1007
1008/// `cfun dbg dom -> codom`
1009class CDecl : public ValDecl {
1010public:
1012 : ValDecl(loc)
1013 , tag_(tag)
1014 , dbg_(dbg)
1015 , dom_(std::move(dom))
1016 , codom_(std::move(codom)) {}
1017
1018 Dbg dbg() const { return dbg_; }
1019 Tok::Tag tag() const { return tag_; }
1020 const Ptrn* dom() const { return dom_.get(); }
1021 const Expr* codom() const { return codom_.get(); }
1022
1023 void bind(Scopes&) const override;
1024 void emit(Emitter&) const override;
1025 std::ostream& stream(Tab&, std::ostream&) const override;
1026
1027private:
1028 Tok::Tag tag_;
1029 Dbg dbg_;
1030 Ptr<Ptrn> dom_;
1031 Ptr<Expr> codom_;
1032};
1033
1034/*
1035 * Module
1036 */
1037
1038class Import : public Node {
1039public:
1041 : Node(loc)
1042 , dbg_(dbg)
1043 , tag_(tag)
1044 , module_(std::move(module)) {}
1045
1046 Dbg dbg() const { return dbg_; }
1047 Tok::Tag tag() const { return tag_; }
1048 const Module* module() const { return module_.get(); }
1049
1050 void bind(Scopes&) const;
1051 void emit(Emitter&) const;
1052 std::ostream& stream(Tab&, std::ostream&) const;
1053
1054 friend void swap(Import& i1, Import& i2) noexcept {
1055 using std::swap;
1056 swap(i1.dbg_, i2.dbg_);
1057 swap(i1.tag_, i2.tag_);
1058 swap(i1.module_, i2.module_);
1059 }
1060
1061private:
1062 Dbg dbg_;
1063 Tok::Tag tag_;
1064 Ptr<Module> module_;
1065};
1066
1067class Module : public Node {
1068public:
1070 : Node(loc)
1071 , imports_(std::move(imports))
1072 , decls_(std::move(decls)) {}
1073
1074 const auto& implicit_imports() const { return implicit_imports_; }
1075 const auto& imports() const { return imports_; }
1076 const auto& decls() const { return decls_; }
1077
1078 void add_implicit_imports(Ptrs<Import>&& imports) const { implicit_imports_ = std::move(imports); }
1079
1080 void compile(AST&) const;
1081 void bind(AST&) const;
1082 void bind(Scopes&) const;
1083 void emit(AST&) const;
1084 void emit(Emitter&) const;
1085 std::ostream& stream(Tab&, std::ostream&) const override;
1086
1087private:
1088 mutable Ptrs<Import> implicit_imports_;
1089 Ptrs<Import> imports_;
1090 Ptrs<ValDecl> decls_;
1091};
1092
1095 return load_plugins(w, Vector<Sym>(plugins.size(), [&](size_t i) { return w.sym(plugins[i]); }));
1096}
1097inline AST load_plugins(World& w, Sym sym) { return load_plugins(w, View<Sym>({sym})); }
1098inline AST load_plugins(World& w, const std::string& plugin) { return load_plugins(w, w.sym(plugin)); }
1099
1100} // 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
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:82
AST(AST &&other)
Definition ast.h:51
World & world()
Definition ast.h:59
friend void swap(AST &a1, AST &a2) noexcept
Definition ast.h:96
Driver & driver()
Definition ast.h:60
auto ptr(Args &&... args)
Definition ast.h:75
AST()=default
Error & error(Loc loc, const char *fmt, Args &&... args) const
Definition ast.h:82
AnnexInfo * name2annex(Dbg dbg, sub_t *)
Definition ast.cpp:14
Sym sym(std::string_view s)
Definition ast.h:68
const auto & plugin2annexes(Sym plugin)
Definition ast.h:91
void bootstrap(Sym plugin, std::ostream &h)
Definition ast.cpp:52
const Error & error() const
Definition ast.h:62
Sym sym_return()
"return".
Definition ast.h:71
Sym sym_anon()
"_".
Definition ast.h:70
Error & note(Loc loc, const char *fmt, Args &&... args) const
Definition ast.h:84
Error & error()
Definition ast.h:61
Sym sym(const char *s)
Definition ast.h:67
Error & warn(Loc loc, const char *fmt, Args &&... args) const
Definition ast.h:83
Sym sym_error()
"_error_".
Definition ast.h:72
Sym sym(const std::string &s)
Definition ast.h:69
AST(World &world)
Definition ast.h:49
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:64
Dbg dbg() const
Definition ast.h:273
const Def * emit_type(Emitter &) const override
Definition emit.cpp:86
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:54
const Ptrn * ptrn() const
Definition ast.h:272
bool is_implicit() const override
Definition ast.h:274
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
AppExpr(Loc loc, bool is_explicit, Ptr< Expr > &&callee, Ptr< Expr > &&arg)
Definition ast.h:643
void bind(Scopes &) const override
Definition bind.cpp:187
const Def * emit_(Emitter &) const override
Definition emit.cpp:281
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:144
bool is_explicit() const
Definition ast.h:649
const Expr * arg() const
Definition ast.h:651
const Expr * callee() const
Definition ast.h:650
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:198
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:194
void bind(Scopes &) const override
Definition bind.cpp:141
ArrowExpr(Loc loc, Ptr< Expr > &&dom, Ptr< Expr > &&codom)
Definition ast.h:540
const Def * emit_(Emitter &) const override
Definition emit.cpp:203
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:862
friend class AxmDecl
Definition ast.h:871
void emit(Emitter &) const override
Definition emit.cpp:374
const auto & subs() const
Definition ast.h:884
const Expr * type() const
Definition ast.h:887
Tok trip() const
Definition ast.h:890
size_t num_subs() const
Definition ast.h:885
AxmDecl(Loc loc, Dbg dbg, std::deque< Ptrs< Alias > > &&subs, Ptr< Expr > &&type, Dbg normalizer, Tok curry, Tok trip)
Definition ast.h:874
Tok curry() const
Definition ast.h:889
void bind(Scopes &) const override
Definition bind.cpp:244
Dbg normalizer() const
Definition ast.h:888
Dbg dbg() const
Definition ast.h:883
const auto & sub(size_t i) const
Definition ast.h:886
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:177
Tok::Tag tag() const
Definition ast.h:1019
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
Definition ast.h:1011
const Ptrn * dom() const
Definition ast.h:1020
void emit(Emitter &) const override
Definition emit.cpp:490
const Expr * codom() const
Definition ast.h:1021
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:228
Dbg dbg() const
Definition ast.h:1018
void bind(Scopes &) const override
Definition bind.cpp:359
const Expr * expr() const
Definition ast.h:417
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:93
const Def * emit_(Emitter &) const override
Definition emit.cpp:186
const auto & decls() const
Definition ast.h:415
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
const Def * def_
Definition ast.h:170
const Def * def() const
Definition ast.h:167
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
const Def * emit_(Emitter &) const override
Definition emit.cpp:130
const Def * emit_type(Emitter &) const override
Definition emit.cpp:79
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:55
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
const Def * emit(Emitter &) const
Definition emit.cpp:125
virtual void emit_body(Emitter &, const Def *) const
Definition ast.h:155
virtual void bind(Scopes &) const =0
Expr(Loc loc)
Definition ast.h:130
virtual const Def * emit_(Emitter &) const =0
virtual const Def * emit_decl(Emitter &, const Def *) const
Definition ast.h:154
static constexpr bool is_rassoc(Prec p)
Definition ast.h:149
const Decl * decl() const
Definition ast.h:772
const Def * emit_(Emitter &) const override
Definition emit.cpp:340
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:160
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index)
Definition ast.h:761
const auto & index() const
Definition ast.h:771
const Expr * tuple() const
Definition ast.h:770
void bind(Scopes &) const override
Definition bind.cpp:216
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Dbg index)
Definition ast.h:765
const Def * emit_type(Emitter &) const override
Definition emit.cpp:88
GrpPtrn(Dbg dbg, const IdPtrn *id)
Definition ast.h:246
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:62
Dbg dbg() const
Definition ast.h:251
const IdPtrn * id() const
Definition ast.h:252
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:131
HoleExpr(Loc loc)
Definition ast.h:334
Dbg dbg() const
Definition ast.h:351
IdExpr(Dbg dbg)
Definition ast.h:347
const Def * emit_(Emitter &) const override
Definition emit.cpp:133
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
dbg: type
Definition ast.h:214
const Def * emit_type(Emitter &) const override
Definition emit.cpp:81
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
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:57
Dbg dbg() const
Definition ast.h:221
const Expr * type() const
Definition ast.h:222
friend void swap(Import &i1, Import &i2) noexcept
Definition ast.h:1054
Import(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Module > &&module)
Definition ast.h:1040
void bind(Scopes &) const
Definition bind.cpp:88
Dbg dbg() const
Definition ast.h:1046
void emit(Emitter &) const
Definition emit.cpp:49
Tok::Tag tag() const
Definition ast.h:1047
const Module * module() const
Definition ast.h:1048
std::ostream & stream(Tab &, std::ostream &) const
Definition stream.cpp:41
const Def * emit_(Emitter &) const override
Definition emit.cpp:215
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:114
const Expr * type() const
Definition ast.h:479
InjExpr(Loc loc, Ptr< Expr > &&value, Ptr< Expr > &&type)
Definition ast.h:473
void bind(Scopes &) const override
Definition bind.cpp:150
const Expr * value() const
Definition ast.h:478
InsertExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index, Ptr< Expr > &&value)
Definition ast.h:788
const Expr * index() const
Definition ast.h:795
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:794
const Def * emit_(Emitter &) const override
Definition emit.cpp:361
const Expr * value() const
Definition ast.h:796
Lam * emit_value(Emitter &) const
Definition emit.cpp:434
const Expr * filter() const
Definition ast.h:957
friend class LamDecl
Definition ast.h:967
bool is_implicit() const
Definition ast.h:956
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:204
void bind(Scopes &, bool quiet=false) const override
Definition bind.cpp:317
Dom(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&filter)
Definition ast.h:952
One of:
Definition ast.h:948
Tok::Tag tag() const
Definition ast.h:986
void bind_body(Scopes &) const override
Definition bind.cpp:352
bool is_external() const
Definition ast.h:987
const Ptrs< Dom > & doms() const
Definition ast.h:988
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:211
const Expr * codom() const
Definition ast.h:991
void emit_decl(Emitter &) const override
Definition emit.cpp:448
size_t num_doms() const
Definition ast.h:990
void emit_body(Emitter &) const override
Definition emit.cpp:474
void bind_decl(Scopes &) const override
Definition bind.cpp:322
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:970
const Dom * dom(size_t i) const
Definition ast.h:989
void bind(Scopes &) const override
Definition bind.cpp:182
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:273
const Def * emit_(Emitter &) const override
Definition emit.cpp:275
LamExpr(Ptr< LamDecl > &&lam)
Definition ast.cpp:159
const LamDecl * lam() const
Definition ast.h:627
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:272
void bind(Scopes &) const override
Definition bind.cpp:289
const Expr * value() const
Definition ast.h:840
const Ptrn * ptrn() const
Definition ast.h:839
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:194
LetDecl(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&value)
Definition ast.h:834
void emit(Emitter &) const override
Definition emit.cpp:411
Tok tok() const
Definition ast.h:392
const Expr * type() const
Definition ast.h:394
const Def * emit_(Emitter &) const override
Definition emit.cpp:169
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
Lam * emit(Emitter &) const
Definition emit.cpp:221
Arm(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&body)
Definition ast.h:498
const Expr * body() const
Definition ast.h:504
virtual void bind(Scopes &) const
Definition bind.cpp:155
const Ptrn * ptrn() const
Definition ast.h:503
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:118
MatchExpr(Loc loc, Ptr< Expr > &&scrutinee, Ptrs< Arm > &&arms)
Definition ast.h:515
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:230
const Expr * scrutinee() const
Definition ast.h:520
const Arm * arm(size_t i) const
Definition ast.h:522
size_t num_arms() const
Definition ast.h:523
const auto & arms() const
Definition ast.h:521
Module(Loc loc, Ptrs< Import > &&imports, Ptrs< ValDecl > &&decls)
Definition ast.h:1069
const auto & decls() const
Definition ast.h:1076
void emit(AST &) const
Definition emit.cpp:37
const auto & implicit_imports() const
Definition ast.h:1074
void bind(AST &) const
Definition bind.cpp:77
const auto & imports() const
Definition ast.h:1075
void compile(AST &) const
Definition ast.cpp:183
void add_implicit_imports(Ptrs< Import > &&imports) const
Definition ast.h:1078
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:116
Loc loc() const
Definition ast.h:119
Node(Loc loc)
Definition ast.h:114
virtual void emit_type(Emitter &) const
Definition emit.cpp:237
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
Definition ast.h:570
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:130
virtual void bind(Scopes &, bool quiet=false) const
Definition bind.cpp:167
friend class PiExpr
Definition ast.h:595
const IdPtrn * ret() const
Definition ast.h:576
bool is_implicit() const
Definition ast.h:574
const Ptrn * ptrn() const
Definition ast.h:575
void add_ret(AST &ast, Ptr< Expr > &&type) const
Definition ast.h:578
const Def * emit_(Emitter &) const override
Definition emit.cpp:266
PiExpr(Loc loc, Tok::Tag tag, Ptr< Dom > &&dom, Ptr< Expr > &&codom)
Definition ast.h:598
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:260
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:264
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:77
const Def * emit_(Emitter &) const override
Definition emit.cpp:143
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
PrimaryExpr(Tok tok)
Definition ast.h:370
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:189
virtual const Def * emit_type(Emitter &) const =0
virtual bool is_implicit() const
Definition ast.h:192
void emit(Emitter &) const override
Definition emit.cpp:417
Dbg dbg() const
Definition ast.h:917
virtual void emit_body(Emitter &) const
Definition emit.cpp:428
virtual void bind_body(Scopes &) const
Definition bind.cpp:315
virtual void emit_decl(Emitter &) const
Definition emit.cpp:422
RecDecl(Loc loc, Dbg dbg, Ptr< Expr > &&type, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
Definition ast.h:910
virtual void bind_decl(Scopes &) const
Definition bind.cpp:304
const Expr * body() const
Definition ast.h:919
const Expr * type() const
Definition ast.h:918
const RecDecl * next() const
Definition ast.h:920
void bind(Scopes &) const override
Definition bind.cpp:298
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:198
const Ptrn * ptrn() const
Definition ast.h:674
const Expr * arg() const
Definition ast.h:676
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
Definition ast.h:667
void bind(Scopes &) const override
Definition bind.cpp:192
const Def * emit_(Emitter &) const override
Definition emit.cpp:287
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:148
const Expr * body() const
Definition ast.h:677
const Expr * callee() const
Definition ast.h:675
const Expr * body() const
Definition ast.h:745
void bind(Scopes &) const override
Definition bind.cpp:209
bool is_arr() const
Definition ast.h:743
const IdPtrn * shape() const
Definition ast.h:744
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:156
const Def * emit_(Emitter &) const override
Definition emit.cpp:311
SeqExpr(Loc loc, bool is_arr, Ptr< IdPtrn > &&shape, Ptr< Expr > &&body)
Definition ast.h:737
const TuplePtrn * ptrn() const
Definition ast.h:699
const Def * emit_(Emitter &) const override
Definition emit.cpp:304
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:153
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:303
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:302
SigmaExpr(Ptr< TuplePtrn > &&ptrn)
Definition ast.h:695
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:722
void bind(Scopes &) const override
Definition bind.cpp:205
TupleExpr(Loc loc, Ptrs< Expr > &&elems)
Definition ast.h:717
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:154
const Def * emit_(Emitter &) const override
Definition emit.cpp:306
const auto & elems() const
Definition ast.h:721
size_t num_elems() const
Definition ast.h:723
(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
Tok::Tag delim_r() const
Definition ast.h:295
const Def * emit_type(Emitter &) const override
Definition emit.cpp:90
const Def * emit_decl(Emitter &, const Def *type) const
Definition emit.cpp:115
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
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:68
Tok::Tag delim_l() const
Definition ast.h:294
const Def * emit_body(Emitter &, const Def *decl) const
Definition emit.cpp:92
bool is_brckt() const
Definition ast.h:297
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:66
const Def * emit_(Emitter &) const override
Definition emit.cpp:138
const Expr * level() const
Definition ast.h:437
TypeExpr(Loc loc, Ptr< Expr > &&level)
Definition ast.h:433
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:453
void bind(Scopes &) const override
Definition bind.cpp:146
const auto & types() const
Definition ast.h:457
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:112
const Def * emit_(Emitter &) const override
Definition emit.cpp:209
const Expr * inhabitant() const
Definition ast.h:816
const Def * emit_(Emitter &) const override
Definition emit.cpp:368
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:812
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
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
std::deque< std::deque< Sym > > subs
List of subs which is a list of aliases.
Definition ast.h:40
struct mim::ast::AnnexInfo::@112046103026102051147230017206327014033073201371 sym
struct mim::ast::AnnexInfo::@177100250272201136376142224053244231100060214216 id
std::optional< bool > pi
Definition ast.h:42
AnnexInfo(Sym sym_plugin, Sym sym_tag, plugin_t id_plugin, tag_t id_tag)
Definition ast.h:26