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/// Reform (type of a rule) `Rule type`.
452class RuleExpr : public Expr {
453public:
455 : Expr(loc)
456 , meta_type_(std::move(meta_type)) {}
457
458 const Expr* meta_type() const { return meta_type_.get(); }
459
460 void bind(Scopes&) const override;
461 std::ostream& stream(Tab&, std::ostream&) const override;
462
463private:
464 const Def* emit_(Emitter&) const override;
465
466 Ptr<Expr> meta_type_;
467};
468
469// union
470
471/// `t1 ∪ t2`
472class UnionExpr : public Expr {
473public:
475 : Expr(loc)
476 , types_(std::move(types)) {}
477
478 const auto& types() const { return types_; }
479
480 void bind(Scopes&) const override;
481 std::ostream& stream(Tab&, std::ostream&) const override;
482
483private:
484 const Def* emit_(Emitter&) const override;
485
486 Ptrs<Expr> types_;
487};
488
489// injection
490
491/// `value inj t1 ∪ t2`
492class InjExpr : public Expr {
493public:
495 : Expr(loc)
496 , value_(std::move(value))
497 , type_(std::move(type)) {}
498
499 const Expr* value() const { return value_.get(); }
500 const Expr* type() const { return type_.get(); }
501
502 void bind(Scopes&) const override;
503 std::ostream& stream(Tab&, std::ostream&) const override;
504
505private:
506 const Def* emit_(Emitter&) const override;
507
508 Ptr<Expr> value_;
509 Ptr<Expr> type_;
510};
511
512// matching for destruction of sum types
513
514// n-ary match
515class MatchExpr : public Expr {
516public:
517 class Arm : public Node {
518 public:
520 : Node(loc)
521 , ptrn_(std::move(ptrn))
522 , body_(std::move(body)) {}
523
524 const Ptrn* ptrn() const { return ptrn_.get(); }
525 const Expr* body() const { return body_.get(); }
526
527 virtual void bind(Scopes&) const;
528 Lam* emit(Emitter&) const;
529 std::ostream& stream(Tab&, std::ostream&) const override;
530
531 private:
532 Ptr<Ptrn> ptrn_;
533 Ptr<Expr> body_;
534 };
535
537 : Expr(loc)
538 , scrutinee_(std::move(scrutinee))
539 , arms_(std::move(arms)) {}
540
541 const Expr* scrutinee() const { return scrutinee_.get(); }
542 const auto& arms() const { return arms_; }
543 const Arm* arm(size_t i) const { return arms_[i].get(); }
544 size_t num_arms() const { return arms_.size(); }
545
546 void bind(Scopes&) const override;
547 std::ostream& stream(Tab&, std::ostream&) const override;
548
549private:
550 const Def* emit_(Emitter&) const override;
551
552 Ptr<Expr> scrutinee_;
553 Ptrs<Arm> arms_;
554};
555
556// lam
557
558/// `dom -> codom`
559class ArrowExpr : public Expr {
560public:
561 ArrowExpr(Loc loc, Ptr<Expr>&& dom, Ptr<Expr>&& codom)
562 : Expr(loc)
563 , dom_(std::move(dom))
564 , codom_(std::move(codom)) {}
565
566private:
567 const Expr* dom() const { return dom_.get(); }
568 const Expr* codom() const { return codom_.get(); }
569
570 void bind(Scopes&) const override;
571 const Def* emit_decl(Emitter&, const Def* type) const override;
572 void emit_body(Emitter&, const Def* decl) const override;
573 std::ostream& stream(Tab&, std::ostream&) const override;
574
575private:
576 const Def* emit_(Emitter&) const override;
577
578 Ptr<Expr> dom_;
579 Ptr<Expr> codom_;
580 mutable Pi* decl_ = nullptr;
581};
582
583/// One of:
584/// * ` {ptrn} → codom`
585/// * `Cn prn`
586/// * `Fn prn → codom`
587class PiExpr : public Expr {
588public:
589 class Dom : public Node {
590 public:
592 : Node(loc)
593 , ptrn_(std::move(ptrn)) {}
594
595 bool is_implicit() const { return ptrn_->is_implicit(); }
596 const Ptrn* ptrn() const { return ptrn_.get(); }
597 const IdPtrn* ret() const { return ret_.get(); }
598
599 void add_ret(AST& ast, Ptr<Expr>&& type) const {
600 auto loc = type->loc();
601 ret_ = ast.ptr<IdPtrn>(loc, Dbg(loc, ast.sym_return()), std::move(type));
602 }
603
604 virtual void bind(Scopes&, bool quiet = false) const;
605 virtual void emit_type(Emitter&) const;
606 std::ostream& stream(Tab&, std::ostream&) const override;
607
608 protected:
609 mutable Pi* decl_ = nullptr;
610 mutable Pi* pi_ = nullptr;
611
612 private:
613 Ptr<Ptrn> ptrn_;
614 mutable Ptr<IdPtrn> ret_;
615
616 friend class PiExpr;
617 };
618
619 PiExpr(Loc loc, Tok::Tag tag, Ptr<Dom>&& dom, Ptr<Expr>&& codom)
620 : Expr(loc)
621 , tag_(tag)
622 , dom_(std::move(dom))
623 , codom_(std::move(codom)) {}
624
625private:
626 Tok::Tag tag() const { return tag_; }
627 const Dom* dom() const { return dom_.get(); }
628 const Expr* codom() const { return codom_.get(); }
629
630 void bind(Scopes&) const override;
631 const Def* emit_decl(Emitter&, const Def* type) const override;
632 void emit_body(Emitter&, const Def* decl) const override;
633 std::ostream& stream(Tab&, std::ostream&) const override;
634
635private:
636 const Def* emit_(Emitter&) const override;
637
638 Tok::Tag tag_;
639 Ptr<Dom> dom_;
640 Ptr<Expr> codom_;
641};
642
643/// Wraps a LamDecl as Expr.
644class LamExpr : public Expr {
645public:
647
648 const LamDecl* lam() const { return lam_.get(); }
649
650 void bind(Scopes&) const override;
651 const Def* emit_decl(Emitter&, const Def* type) const override;
652 void emit_body(Emitter&, const Def* decl) const override;
653 std::ostream& stream(Tab&, std::ostream&) const override;
654
655private:
656 const Def* emit_(Emitter&) const override;
657
658 Ptr<LamDecl> lam_;
659};
660
661/// `callee arg`
662class AppExpr : public Expr {
663public:
665 : Expr(loc)
666 , is_explicit_(is_explicit)
667 , callee_(std::move(callee))
668 , arg_(std::move(arg)) {}
669
670 bool is_explicit() const { return is_explicit_; }
671 const Expr* callee() const { return callee_.get(); }
672 const Expr* arg() const { return arg_.get(); }
673
674 void bind(Scopes&) const override;
675 std::ostream& stream(Tab&, std::ostream&) const override;
676
677private:
678 const Def* emit_(Emitter&) const override;
679
680 bool is_explicit_;
681 Ptr<Expr> callee_;
682 Ptr<Expr> arg_;
683};
684
685/// `ret ptrn = callee $ arg; body`
686class RetExpr : public Expr {
687public:
689 : Expr(loc)
690 , ptrn_(std::move(ptrn))
691 , callee_(std::move(callee))
692 , arg_(std::move(arg))
693 , body_(std::move(body)) {}
694
695 const Ptrn* ptrn() const { return ptrn_.get(); }
696 const Expr* callee() const { return callee_.get(); }
697 const Expr* arg() const { return arg_.get(); }
698 const Expr* body() const { return body_.get(); }
699
700 void bind(Scopes&) const override;
701 std::ostream& stream(Tab&, std::ostream&) const override;
702
703private:
704 const Def* emit_(Emitter&) const override;
705
706 Ptr<Ptrn> ptrn_;
707 Ptr<Expr> callee_;
708 Ptr<Expr> arg_;
709 Ptr<Expr> body_;
710};
711// tuple
712
713/// Just wraps TuplePtrn as Expr.
714class SigmaExpr : public Expr {
715public:
717 : Expr(ptrn->loc())
718 , ptrn_(std::move(ptrn)) {}
719
720 const TuplePtrn* ptrn() const { return ptrn_.get(); }
721
722 void bind(Scopes&) const override;
723 const Def* emit_decl(Emitter&, const Def* type) const override;
724 void emit_body(Emitter&, const Def* decl) const override;
725 std::ostream& stream(Tab&, std::ostream&) const override;
726
727private:
728 const Def* emit_(Emitter&) const override;
729
730 Ptr<TuplePtrn> ptrn_;
731
733};
734
735/// `(elem_0, ..., elem_n-1)`
736class TupleExpr : public Expr {
737public:
739 : Expr(loc)
740 , elems_(std::move(elems)) {}
741
742 const auto& elems() const { return elems_; }
743 const Expr* elem(size_t i) const { return elems_[i].get(); }
744 size_t num_elems() const { return elems().size(); }
745
746 void bind(Scopes&) const override;
747 std::ostream& stream(Tab&, std::ostream&) const override;
748
749private:
750 const Def* emit_(Emitter&) const override;
751
752 Ptrs<Expr> elems_;
753};
754
755/// `«dbg: arity; body»` or `‹dbg: arity; body›`
756class SeqExpr : public Expr {
757public:
759 : Expr(loc)
760 , is_arr_(is_arr)
761 , arity_(std::move(arity))
762 , body_(std::move(body)) {}
763
764 bool is_arr() const { return is_arr_; }
765 const IdPtrn* arity() const { return arity_.get(); }
766 const Expr* body() const { return body_.get(); }
767
768 void bind(Scopes&) const override;
769 std::ostream& stream(Tab&, std::ostream&) const override;
770
771private:
772 const Def* emit_(Emitter&) const override;
773
774 bool is_arr_;
775 Ptr<IdPtrn> arity_;
776 Ptr<Expr> body_;
777};
778
779/// `tuple#index`
780class ExtractExpr : public Expr {
781public:
783 : Expr(loc)
784 , tuple_(std::move(tuple))
785 , index_(std::move(index)) {}
787 : Expr(loc)
788 , tuple_(std::move(tuple))
789 , index_(index) {}
790
791 const Expr* tuple() const { return tuple_.get(); }
792 const auto& index() const { return index_; }
793 const Decl* decl() const { return decl_; }
794
795 void bind(Scopes&) const override;
796 std::ostream& stream(Tab&, std::ostream&) const override;
797
798private:
799 const Def* emit_(Emitter&) const override;
800
801 Ptr<Expr> tuple_;
802 std::variant<Ptr<Expr>, Dbg> index_;
803 mutable const Decl* decl_ = nullptr;
804};
805
806/// `ins(tuple, index, value)`
807class InsertExpr : public Expr {
808public:
810 : Expr(loc)
811 , tuple_(std::move(tuple))
812 , index_(std::move(index))
813 , value_(std::move(value)) {}
814
815 const Expr* tuple() const { return tuple_.get(); }
816 const Expr* index() const { return index_.get(); }
817 const Expr* value() const { return value_.get(); }
818
819 void bind(Scopes&) const override;
820 std::ostream& stream(Tab&, std::ostream&) const override;
821
822private:
823 const Def* emit_(Emitter&) const override;
824
825 Ptr<Expr> tuple_;
826 Ptr<Expr> index_;
827 Ptr<Expr> value_;
828};
829
830/// `⦃ expr ⦄`
831class UniqExpr : public Expr {
832public:
833 UniqExpr(Loc loc, Ptr<Expr>&& expr)
834 : Expr(loc)
835 , inhabitant_(std::move(expr)) {}
836
837 const Expr* inhabitant() const { return inhabitant_.get(); }
838
839 void bind(Scopes&) const override;
840 std::ostream& stream(Tab&, std::ostream&) const override;
841
842private:
843 const Def* emit_(Emitter&) const override;
844
845 Ptr<Expr> inhabitant_;
846};
847
848/*
849 * Decls
850 */
851
852/// `let ptrn: type = value;`
853class LetDecl : public ValDecl {
854public:
856 : ValDecl(loc)
857 , ptrn_(std::move(ptrn))
858 , value_(std::move(value)) {}
859
860 const Ptrn* ptrn() const { return ptrn_.get(); }
861 const Expr* value() const { return value_.get(); }
862
863 void bind(Scopes&) const override;
864 void emit(Emitter&) const override;
865 std::ostream& stream(Tab&, std::ostream&) const override;
866
867private:
868 Ptr<Ptrn> ptrn_;
869 Ptr<Expr> value_;
870 mutable AnnexInfo* annex_ = nullptr;
871 mutable sub_t sub_ = 0;
872};
873
874/// `axm ptrn: type = value;`
875class AxmDecl : public ValDecl {
876public:
877 class Alias : public Decl {
878 public:
880 : Decl(dbg.loc())
881 , dbg_(dbg) {}
882
883 Dbg dbg() const { return dbg_; }
884
885 void bind(Scopes&, const AxmDecl*) const;
886 std::ostream& stream(Tab&, std::ostream&) const override;
887
888 private:
889 Dbg dbg_;
890 mutable Dbg full_;
891
892 friend class AxmDecl;
893 };
894
896 : ValDecl(loc)
897 , dbg_(dbg)
898 , subs_(std::move(subs))
899 , type_(std::move(type))
900 , normalizer_(normalizer)
901 , curry_(curry)
902 , trip_(trip) {}
903
904 Dbg dbg() const { return dbg_; }
905 const auto& subs() const { return subs_; }
906 size_t num_subs() const { return subs_.size(); }
907 const auto& sub(size_t i) const { return subs_[i]; }
908 const Expr* type() const { return type_.get(); }
909 Dbg normalizer() const { return normalizer_; }
910 Tok curry() const { return curry_; }
911 Tok trip() const { return trip_; }
912
913 void bind(Scopes&) const override;
914 void emit(Emitter&) const override;
915 std::ostream& stream(Tab&, std::ostream&) const override;
916
917private:
918 Dbg dbg_;
919 std::deque<Ptrs<Alias>> subs_;
920 Ptr<Expr> type_;
921 Dbg normalizer_;
922 Tok curry_, trip_;
923 mutable sub_t offset_;
924 mutable AnnexInfo* annex_ = nullptr;
925 mutable const Def* mim_type_;
926};
927
928/// `.rec dbg: type = body`
929class RecDecl : public ValDecl {
930public:
932 : ValDecl(loc)
933 , dbg_(dbg)
934 , type_(std::move(type))
935 , body_(std::move(body))
936 , next_(std::move(next)) {}
937
938 Dbg dbg() const { return dbg_; }
939 const Expr* type() const { return type_.get(); }
940 const Expr* body() const { return body_.get(); }
941 const RecDecl* next() const { return next_.get(); }
942
943 void bind(Scopes&) const override;
944 virtual void bind_decl(Scopes&) const;
945 virtual void bind_body(Scopes&) const;
946
947 void emit(Emitter&) const override;
948 virtual void emit_decl(Emitter&) const;
949 virtual void emit_body(Emitter&) const;
950
951 std::ostream& stream(Tab&, std::ostream&) const override;
952
953private:
954 Dbg dbg_;
955 Ptr<Expr> type_;
956 Ptr<Expr> body_;
957 Ptr<RecDecl> next_;
958 mutable AnnexInfo* annex_ = nullptr;
959 mutable sub_t sub_ = 0;
960};
961
962/// One of:
963/// * `λ dom_0 ... dom_n-1 -> codom`
964/// * `cn dom_0 ... dom_n-1`
965/// * `fn dom_0 ... dom_n-1 -> codom`
966/// * `lam dbg dom_0 ... dom_n-1 -> codom`
967/// * `con dbg dom_0 ... dom_n-1`
968/// * `fun dbg dom_0 ... dom_n-1 -> codom`
969class LamDecl : public RecDecl {
970public:
971 class Dom : public PiExpr::Dom {
972 public:
974 : PiExpr::Dom(loc, std::move(ptrn))
975 , filter_(std::move(filter)) {}
976
977 bool is_implicit() const { return ptrn()->is_implicit(); }
978 const Expr* filter() const { return filter_.get(); }
979
980 void bind(Scopes&, bool quiet = false) const override;
981 Lam* emit_value(Emitter&) const;
982 std::ostream& stream(Tab&, std::ostream&) const override;
983
984 private:
985 Ptr<Expr> filter_;
986 mutable Lam* lam_;
987
988 friend class LamDecl;
989 };
990
993 bool is_external,
994 Dbg dbg,
995 Ptrs<Dom>&& doms,
997 Ptr<Expr>&& body,
999 : RecDecl(loc, dbg, nullptr, std::move(body), std::move(next))
1000 , tag_(tag)
1001 , is_external_(is_external)
1002 , doms_(std::move(doms))
1003 , codom_(std::move(codom)) {
1004 assert(num_doms() != 0);
1005 }
1006
1007 Tok::Tag tag() const { return tag_; }
1008 bool is_external() const { return is_external_; }
1009 const Ptrs<Dom>& doms() const { return doms_; }
1010 const Dom* dom(size_t i) const { return doms_[i].get(); }
1011 size_t num_doms() const { return doms_.size(); }
1012 const Expr* codom() const { return codom_.get(); }
1013
1014 void bind_decl(Scopes&) const override;
1015 void bind_body(Scopes&) const override;
1016 void emit_decl(Emitter&) const override;
1017 void emit_body(Emitter&) const override;
1018 std::ostream& stream(Tab&, std::ostream&) const override;
1019
1020private:
1021 Tok::Tag tag_;
1022 bool is_external_;
1023 Ptrs<Dom> doms_;
1024 Ptr<Expr> codom_;
1025 mutable AnnexInfo* annex_ = nullptr;
1026 mutable sub_t sub_ = 0;
1027};
1028
1029/// `cfun dbg dom -> codom`
1030class CDecl : public ValDecl {
1031public:
1033 : ValDecl(loc)
1034 , tag_(tag)
1035 , dbg_(dbg)
1036 , dom_(std::move(dom))
1037 , codom_(std::move(codom)) {}
1038
1039 Dbg dbg() const { return dbg_; }
1040 Tok::Tag tag() const { return tag_; }
1041 const Ptrn* dom() const { return dom_.get(); }
1042 const Expr* codom() const { return codom_.get(); }
1043
1044 void bind(Scopes&) const override;
1045 void emit(Emitter&) const override;
1046 std::ostream& stream(Tab&, std::ostream&) const override;
1047
1048private:
1049 Tok::Tag tag_;
1050 Dbg dbg_;
1051 Ptr<Ptrn> dom_;
1052 Ptr<Expr> codom_;
1053};
1054
1055/// rewrite rules
1056/// rule (x:T, y:T) : x+y => y+x (when );
1057/// all meta variables have to be introduced
1058
1059class RuleDecl : public ValDecl {
1060public:
1062 : ValDecl(loc)
1063 , dbg_(std::move(dbg))
1064 , var_(std::move(var))
1065 , lhs_(std::move(lhs))
1066 , rhs_(std::move(rhs))
1067 , guard_(std::move(guard))
1068 , is_normalizer_(is_normalizer) {}
1069
1070 Dbg dbg() const { return dbg_; }
1071 const Ptrn* var() const { return var_.get(); }
1072 const Expr* lhs() const { return lhs_.get(); }
1073 const Expr* rhs() const { return rhs_.get(); }
1074 const Expr* guard() const { return guard_.get(); }
1075 bool is_normalizer() const { return is_normalizer_; }
1076
1077 void bind(Scopes&) const override;
1078 std::ostream& stream(Tab&, std::ostream&) const override;
1079
1080private:
1081 void emit(Emitter&) const override;
1082
1083 Dbg dbg_;
1084 Ptr<Ptrn> var_;
1085 Ptr<Expr> lhs_;
1086 Ptr<Expr> rhs_;
1087 Ptr<Expr> guard_;
1088 bool is_normalizer_;
1089};
1090
1091/*
1092 * Module
1093 */
1094
1095class Import : public Node {
1096public:
1098 : Node(loc)
1099 , dbg_(dbg)
1100 , tag_(tag)
1101 , module_(std::move(module)) {}
1102
1103 Dbg dbg() const { return dbg_; }
1104 Tok::Tag tag() const { return tag_; }
1105 const Module* module() const { return module_.get(); }
1106
1107 void bind(Scopes&) const;
1108 void emit(Emitter&) const;
1109 std::ostream& stream(Tab&, std::ostream&) const;
1110
1111 friend void swap(Import& i1, Import& i2) noexcept {
1112 using std::swap;
1113 swap(i1.dbg_, i2.dbg_);
1114 swap(i1.tag_, i2.tag_);
1115 swap(i1.module_, i2.module_);
1116 }
1117
1118private:
1119 Dbg dbg_;
1120 Tok::Tag tag_;
1121 Ptr<Module> module_;
1122};
1123
1124class Module : public Node {
1125public:
1127 : Node(loc)
1128 , imports_(std::move(imports))
1129 , decls_(std::move(decls)) {}
1130
1131 const auto& implicit_imports() const { return implicit_imports_; }
1132 const auto& imports() const { return imports_; }
1133 const auto& decls() const { return decls_; }
1134
1135 void add_implicit_imports(Ptrs<Import>&& imports) const { implicit_imports_ = std::move(imports); }
1136
1137 void compile(AST&) const;
1138 void bind(AST&) const;
1139 void bind(Scopes&) const;
1140 void emit(AST&) const;
1141 void emit(Emitter&) const;
1142 std::ostream& stream(Tab&, std::ostream&) const override;
1143
1144private:
1145 mutable Ptrs<Import> implicit_imports_;
1146 Ptrs<Import> imports_;
1147 Ptrs<ValDecl> decls_;
1148};
1149
1152 return load_plugins(w, Vector<Sym>(plugins.size(), [&](size_t i) { return w.sym(plugins[i]); }));
1153}
1154inline AST load_plugins(World& w, Sym sym) { return load_plugins(w, View<Sym>({sym})); }
1155inline AST load_plugins(World& w, const std::string& plugin) { return load_plugins(w, w.sym(plugin)); }
1156
1157} // namespace mim::ast
Base class for all Defs.
Definition def.h:251
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:110
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:31
const Driver & driver() const
Definition world.h:86
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:664
void bind(Scopes &) const override
Definition bind.cpp:196
const Def * emit_(Emitter &) const override
Definition emit.cpp:295
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:152
bool is_explicit() const
Definition ast.h:670
const Expr * arg() const
Definition ast.h:672
const Expr * callee() const
Definition ast.h:671
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:210
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:114
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:206
void bind(Scopes &) const override
Definition bind.cpp:148
ArrowExpr(Loc loc, Ptr< Expr > &&dom, Ptr< Expr > &&codom)
Definition ast.h:561
const Def * emit_(Emitter &) const override
Definition emit.cpp:215
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:183
void bind(Scopes &, const AxmDecl *) const
Definition bind.cpp:248
Dbg dbg() const
Definition ast.h:883
friend class AxmDecl
Definition ast.h:892
void emit(Emitter &) const override
Definition emit.cpp:388
const auto & subs() const
Definition ast.h:905
const Expr * type() const
Definition ast.h:908
Tok trip() const
Definition ast.h:911
size_t num_subs() const
Definition ast.h:906
AxmDecl(Loc loc, Dbg dbg, std::deque< Ptrs< Alias > > &&subs, Ptr< Expr > &&type, Dbg normalizer, Tok curry, Tok trip)
Definition ast.h:895
Tok curry() const
Definition ast.h:910
void bind(Scopes &) const override
Definition bind.cpp:254
Dbg normalizer() const
Definition ast.h:909
Dbg dbg() const
Definition ast.h:904
const auto & sub(size_t i) const
Definition ast.h:907
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:185
Tok::Tag tag() const
Definition ast.h:1040
CDecl(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Ptrn > &&dom, Ptr< Expr > &&codom)
Definition ast.h:1032
const Ptrn * dom() const
Definition ast.h:1041
void emit(Emitter &) const override
Definition emit.cpp:524
const Expr * codom() const
Definition ast.h:1042
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:236
Dbg dbg() const
Definition ast.h:1039
void bind(Scopes &) const override
Definition bind.cpp:379
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:196
const auto & decls() const
Definition ast.h:418
void bind(Scopes &) const override
Definition bind.cpp:138
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:123
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:793
const Def * emit_(Emitter &) const override
Definition emit.cpp:354
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:168
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index)
Definition ast.h:782
const auto & index() const
Definition ast.h:792
const Expr * tuple() const
Definition ast.h:791
void bind(Scopes &) const override
Definition bind.cpp:226
ExtractExpr(Loc loc, Ptr< Expr > &&tuple, Dbg index)
Definition ast.h:786
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:124
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:1111
Import(Loc loc, Tok::Tag tag, Dbg dbg, Ptr< Module > &&module)
Definition ast.h:1097
void bind(Scopes &) const
Definition bind.cpp:91
Dbg dbg() const
Definition ast.h:1103
void emit(Emitter &) const
Definition emit.cpp:53
Tok::Tag tag() const
Definition ast.h:1104
const Module * module() const
Definition ast.h:1105
std::ostream & stream(Tab &, std::ostream &) const
Definition stream.cpp:42
const Def * emit_(Emitter &) const override
Definition emit.cpp:228
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:120
const Expr * type() const
Definition ast.h:500
InjExpr(Loc loc, Ptr< Expr > &&value, Ptr< Expr > &&type)
Definition ast.h:494
void bind(Scopes &) const override
Definition bind.cpp:158
const Expr * value() const
Definition ast.h:499
InsertExpr(Loc loc, Ptr< Expr > &&tuple, Ptr< Expr > &&index, Ptr< Expr > &&value)
Definition ast.h:809
const Expr * index() const
Definition ast.h:816
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:173
void bind(Scopes &) const override
Definition bind.cpp:236
const Expr * tuple() const
Definition ast.h:815
const Def * emit_(Emitter &) const override
Definition emit.cpp:375
const Expr * value() const
Definition ast.h:817
Lam * emit_value(Emitter &) const
Definition emit.cpp:452
const Expr * filter() const
Definition ast.h:978
friend class LamDecl
Definition ast.h:988
bool is_implicit() const
Definition ast.h:977
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:212
void bind(Scopes &, bool quiet=false) const override
Definition bind.cpp:335
Dom(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&filter)
Definition ast.h:973
One of:
Definition ast.h:969
Tok::Tag tag() const
Definition ast.h:1007
void bind_body(Scopes &) const override
Definition bind.cpp:371
bool is_external() const
Definition ast.h:1008
const Ptrs< Dom > & doms() const
Definition ast.h:1009
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:219
const Expr * codom() const
Definition ast.h:1012
void emit_decl(Emitter &) const override
Definition emit.cpp:466
size_t num_doms() const
Definition ast.h:1011
void emit_body(Emitter &) const override
Definition emit.cpp:493
void bind_decl(Scopes &) const override
Definition bind.cpp:340
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:991
const Dom * dom(size_t i) const
Definition ast.h:1010
void bind(Scopes &) const override
Definition bind.cpp:191
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:287
const Def * emit_(Emitter &) const override
Definition emit.cpp:289
LamExpr(Ptr< LamDecl > &&lam)
Definition ast.cpp:161
const LamDecl * lam() const
Definition ast.h:648
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:150
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:286
void bind(Scopes &) const override
Definition bind.cpp:305
const Expr * value() const
Definition ast.h:861
const Ptrn * ptrn() const
Definition ast.h:860
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:202
LetDecl(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&value)
Definition ast.h:855
void emit(Emitter &) const override
Definition emit.cpp:427
Tok tok() const
Definition ast.h:395
const Expr * type() const
Definition ast.h:397
const Def * emit_(Emitter &) const override
Definition emit.cpp:179
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:128
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:82
Lam * emit(Emitter &) const
Definition emit.cpp:234
Arm(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&body)
Definition ast.h:519
const Expr * body() const
Definition ast.h:525
virtual void bind(Scopes &) const
Definition bind.cpp:163
const Ptrn * ptrn() const
Definition ast.h:524
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:124
MatchExpr(Loc loc, Ptr< Expr > &&scrutinee, Ptrs< Arm > &&arms)
Definition ast.h:536
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:128
void bind(Scopes &) const override
Definition bind.cpp:170
const Def * emit_(Emitter &) const override
Definition emit.cpp:243
const Expr * scrutinee() const
Definition ast.h:541
const Arm * arm(size_t i) const
Definition ast.h:543
size_t num_arms() const
Definition ast.h:544
const auto & arms() const
Definition ast.h:542
Module(Loc loc, Ptrs< Import > &&imports, Ptrs< ValDecl > &&decls)
Definition ast.h:1126
const auto & decls() const
Definition ast.h:1133
void emit(AST &) const
Definition emit.cpp:38
const auto & implicit_imports() const
Definition ast.h:1131
void bind(AST &) const
Definition bind.cpp:77
const auto & imports() const
Definition ast.h:1132
void compile(AST &) const
Definition ast.cpp:185
void add_implicit_imports(Ptrs< Import > &&imports) const
Definition ast.h:1135
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:251
Dom(Loc loc, Ptr< Ptrn > &&ptrn)
Definition ast.h:591
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:137
virtual void bind(Scopes &, bool quiet=false) const
Definition bind.cpp:176
friend class PiExpr
Definition ast.h:616
const IdPtrn * ret() const
Definition ast.h:597
bool is_implicit() const
Definition ast.h:595
const Ptrn * ptrn() const
Definition ast.h:596
void add_ret(AST &ast, Ptr< Expr > &&type) const
Definition ast.h:599
const Def * emit_(Emitter &) const override
Definition emit.cpp:280
PiExpr(Loc loc, Tok::Tag tag, Ptr< Dom > &&dom, Ptr< Expr > &&codom)
Definition ast.h:619
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:274
void bind(Scopes &) const override
Definition bind.cpp:181
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:143
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:278
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:80
const Def * emit_(Emitter &) const override
Definition emit.cpp:153
Tok::Tag tag() const
Definition ast.h:376
void bind(Scopes &) const override
Definition bind.cpp:125
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:179
static Ptr< Expr > to_expr(AST &, Ptr< Ptrn > &&)
Definition ast.cpp:169
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:433
Dbg dbg() const
Definition ast.h:938
virtual void emit_body(Emitter &) const
Definition emit.cpp:446
virtual void bind_body(Scopes &) const
Definition bind.cpp:333
virtual void emit_decl(Emitter &) const
Definition emit.cpp:440
RecDecl(Loc loc, Dbg dbg, Ptr< Expr > &&type, Ptr< Expr > &&body, Ptr< RecDecl > &&next)
Definition ast.h:931
virtual void bind_decl(Scopes &) const
Definition bind.cpp:322
const Expr * body() const
Definition ast.h:940
const Expr * type() const
Definition ast.h:939
const RecDecl * next() const
Definition ast.h:941
void bind(Scopes &) const override
Definition bind.cpp:314
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:206
const Ptrn * ptrn() const
Definition ast.h:695
const Expr * arg() const
Definition ast.h:697
RetExpr(Loc loc, Ptr< Ptrn > &&ptrn, Ptr< Expr > &&callee, Ptr< Expr > &&arg, Ptr< Expr > body)
Definition ast.h:688
void bind(Scopes &) const override
Definition bind.cpp:201
const Def * emit_(Emitter &) const override
Definition emit.cpp:301
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:156
const Expr * body() const
Definition ast.h:698
const Expr * callee() const
Definition ast.h:696
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:242
void bind(Scopes &) const override
Definition bind.cpp:387
RuleDecl(Loc loc, Dbg dbg, Ptr< Ptrn > &&var, Ptr< Expr > &&lhs, Ptr< Expr > &&rhs, Ptr< Expr > &&guard, bool is_normalizer)
Definition ast.h:1061
const Ptrn * var() const
Definition ast.h:1071
const Expr * guard() const
Definition ast.h:1074
bool is_normalizer() const
Definition ast.h:1075
const Expr * rhs() const
Definition ast.h:1073
const Expr * lhs() const
Definition ast.h:1072
Dbg dbg() const
Definition ast.h:1070
void emit(Emitter &) const override
Definition emit.cpp:534
const Expr * meta_type() const
Definition ast.h:458
RuleExpr(Loc loc, Ptr< Expr > &&meta_type)
Definition ast.h:454
void bind(Scopes &) const override
Definition bind.cpp:122
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:112
const Def * emit_(Emitter &) const override
Definition emit.cpp:148
const Expr * body() const
Definition ast.h:766
const IdPtrn * arity() const
Definition ast.h:765
SeqExpr(Loc loc, bool is_arr, Ptr< IdPtrn > &&arity, Ptr< Expr > &&body)
Definition ast.h:758
void bind(Scopes &) const override
Definition bind.cpp:219
bool is_arr() const
Definition ast.h:764
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:164
const Def * emit_(Emitter &) const override
Definition emit.cpp:325
const TuplePtrn * ptrn() const
Definition ast.h:720
const Def * emit_(Emitter &) const override
Definition emit.cpp:318
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:161
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:317
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:316
SigmaExpr(Ptr< TuplePtrn > &&ptrn)
Definition ast.h:716
void bind(Scopes &) const override
Definition bind.cpp:208
static constexpr Tok::Tag delim_l2r(Tag tag)
Definition tok.h:127
const Expr * elem(size_t i) const
Definition ast.h:743
void bind(Scopes &) const override
Definition bind.cpp:214
TupleExpr(Loc loc, Ptrs< Expr > &&elems)
Definition ast.h:738
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:162
const Def * emit_(Emitter &) const override
Definition emit.cpp:320
const auto & elems() const
Definition ast.h:742
size_t num_elems() const
Definition ast.h:744
(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:474
void bind(Scopes &) const override
Definition bind.cpp:153
const auto & types() const
Definition ast.h:478
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:118
const Def * emit_(Emitter &) const override
Definition emit.cpp:221
const Expr * inhabitant() const
Definition ast.h:837
const Def * emit_(Emitter &) const override
Definition emit.cpp:382
void bind(Scopes &) const override
Definition bind.cpp:242
std::ostream & stream(Tab &, std::ostream &) const override
Definition stream.cpp:177
UniqExpr(Loc loc, Ptr< Expr > &&expr)
Definition ast.h:833
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:192
std::deque< Ptr< T > > Ptrs
Definition ast.h:24
u8 sub_t
Definition types.h:49
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:47
u8 tag_t
Definition types.h:48
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