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