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