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