Extends Rewriter for variable substitution. More...
#include <mim/rewrite.h>
Public Member Functions | |
Construction | |
| VarRewriter (World &world) | |
| VarRewriter (const Var *var, const Def *arg) | |
| VarRewriter & | add (const Var *var, const Def *arg) |
Substitutes arg for var. | |
rewrite | |
| const Def * | rewrite (const Def *) final |
| const Def * | rewrite_mut (Def *) final |
| Public Member Functions inherited from mim::Rewriter | |
| template<class D = Def> | |
| D * | curr_mut () const |
| Rewriter (World &world) | |
| virtual | ~Rewriter () |
| void | reset () |
| World & | world () |
| void | push (Vars old_vars={}, Vars new_vars={}) |
| void | pop () |
| void | bind_old (const Var *var) |
Adds the old var - if any - to the innermost scope. | |
| void | bind_new (const Var *var) |
Adds the new var - if any - to the innermost scope. | |
| void | bind (const Var *old_var, const Var *new_var) |
| const Def * | map (const Def *old_def, const Def *new_def) |
| const Def * | map (const Def *old_def, Defs new_defs) |
| const Def * | map (Defs old_defs, const Def *new_def) |
| const Def * | map (Defs old_defs, Defs new_defs) |
| virtual const Def * | lookup (const Def *old_def) |
| Lookup old_def by searching in reverse through the stack of maps. | |
| virtual const Def * | rewrite_imm (const Def *) |
| virtual const Def * | rewrite_stub (Def *, Def *) |
| const Def * | rewrite_stub (Def *old_mut, Def *new_mut, fe::View< size_t > new2old) |
Like above, but new_mut may have a different number of ops than old_mut: new_mut->op(i) is rewritten from old_mut->op(new2old[i]). | |
| virtual DefVec | rewrite (Defs) |
| virtual const Def * | rewrite_imm_Lit (const Lit *) |
| virtual const Def * | rewrite_imm_Axm (const Axm *) |
| virtual const Def * | rewrite_imm_Var (const Var *) |
| virtual const Def * | rewrite_imm_Proxy (const Proxy *) |
| virtual const Def * | rewrite_imm_Type (const Type *) |
| virtual const Def * | rewrite_imm_Level (const Level *) |
| virtual const Def * | rewrite_imm_LMax (const LMax *) |
| virtual const Def * | rewrite_imm_LSucc (const LSucc *) |
| virtual const Def * | rewrite_imm_Pi (const Pi *) |
| virtual const Def * | rewrite_imm_Lam (const Lam *) |
| virtual const Def * | rewrite_imm_App (const App *) |
| virtual const Def * | rewrite_imm_Sigma (const Sigma *) |
| virtual const Def * | rewrite_imm_Tuple (const Tuple *) |
| virtual const Def * | rewrite_imm_Extract (const Extract *) |
| virtual const Def * | rewrite_imm_Insert (const Insert *) |
| virtual const Def * | rewrite_imm_Arr (const Arr *) |
| virtual const Def * | rewrite_imm_Pack (const Pack *) |
| virtual const Def * | rewrite_imm_Join (const Join *) |
| virtual const Def * | rewrite_imm_Inj (const Inj *) |
| virtual const Def * | rewrite_imm_Match (const Match *) |
| virtual const Def * | rewrite_imm_Variant (const Variant *) |
| virtual const Def * | rewrite_imm_Top (const Top *) |
| virtual const Def * | rewrite_imm_Bot (const Bot *) |
| virtual const Def * | rewrite_imm_Reform (const Reform *) |
| virtual const Def * | rewrite_imm_Rule (const Rule *) |
| virtual const Def * | rewrite_imm_Single (const Single *) |
| virtual const Def * | rewrite_imm_Wrap (const Wrap *) |
| virtual const Def * | rewrite_imm_Nat (const Nat *) |
| virtual const Def * | rewrite_imm_Idx (const Idx *) |
| virtual const Def * | rewrite_imm_Nom (const Nom *) |
| virtual const Def * | rewrite_imm_Name (const Name *) |
| virtual const Def * | rewrite_imm_Struc (const Struc *) |
| virtual const Def * | rewrite_mut_Hole (Hole *) |
| virtual const Def * | rewrite_mut_Pi (Pi *) |
| virtual const Def * | rewrite_mut_Lam (Lam *) |
| virtual const Def * | rewrite_mut_Sigma (Sigma *) |
| virtual const Def * | rewrite_mut_Arr (Arr *) |
| virtual const Def * | rewrite_mut_Pack (Pack *) |
| virtual const Def * | rewrite_mut_Variant (Variant *) |
| virtual const Def * | rewrite_mut_Rule (Rule *) |
| virtual const Def * | rewrite_imm_Seq (const Seq *seq) |
| virtual const Def * | rewrite_mut_Seq (Seq *seq) |
Friends | |
| void | swap (VarRewriter &vrw1, VarRewriter &vrw2) noexcept |
Additional Inherited Members | |
| Protected Member Functions inherited from mim::Rewriter | |
| Def2Def & | old2new () |
| The map of the innermost push() scope. | |
| bool | has_intersection (const Def *old_def) |
Does old_def depend on the old Vars of any scope? | |
| auto | enter (Def *new_mut) |
Updates curr_mut() to new_mut and restores it at the end of the scope. | |
| const Def * | seal (Def *old_mut, Def *new_mut) |
The tail of rewrite_stub: immutabilizes new_mut in hindsight, as rewriting may have made it vacuous. | |
| Protected Attributes inherited from mim::Rewriter | |
| fe::Vector< Scope > | scopes_ |
|
inline |
Definition at line 146 of file rewrite.h.
References mim::Rewriter::Rewriter(), and mim::Rewriter::world().
Referenced by add(), mim::ast::SeqExpr::emit_(), mim::ast::LamDecl::emit_body(), mim::plug::cps::op_cps2ds_dep(), mim::World::reduce(), mim::World::reduce(), mim::Rule::replace(), mim::plug::mem::phase::AddMem::rewrite_imm_Pi(), swap, and mim::Hole::tuplefy().
Definition at line 148 of file rewrite.h.
References add(), mim::Rewriter::Rewriter(), and mim::Rewriter::world().
|
inline |
Substitutes arg for var.
Definition at line 154 of file rewrite.h.
References mim::Rewriter::bind_old(), mim::Rewriter::map(), and VarRewriter().
Referenced by VarRewriter().
Reimplemented from mim::Rewriter.
Definition at line 291 of file rewrite.cpp.
References mim::Def::dbg_key(), mim::Rewriter::has_intersection(), mim::Def::isa_mut(), mim::Def::local_muts(), mim::Def::local_vars(), mim::Rewriter::lookup(), mim::Rewriter::rewrite_imm(), rewrite_mut(), and mim::Def::set().
Reimplemented from mim::Rewriter.
Definition at line 302 of file rewrite.cpp.
References mim::Rewriter::bind_old(), mim::Def::has_var(), and mim::Rewriter::rewrite_mut().
Referenced by rewrite().
|
friend |
Definition at line 167 of file rewrite.h.
References mim::Rewriter::Rewriter(), swap, and VarRewriter().
Referenced by swap.