Rename module and add comments

This commit is contained in:
imaqtkatt 2024-07-02 12:12:12 -03:00
parent 842891cbf4
commit 8ad65d7f6a
4 changed files with 13 additions and 8 deletions

View File

@ -495,18 +495,22 @@ impl<'a> TermParser<'a> {
self.skip_trivia(); self.skip_trivia();
let (cur_name, rule) = self.parse_rule()?; let (cur_name, rule) = self.parse_rule()?;
let mut rules = vec![rule]; let mut rules = vec![rule];
// the current index to backtack in case of fail to parse the next rule.
let mut nxt_term = *self.index(); let mut nxt_term = *self.index();
loop { loop {
self.skip_trivia(); self.skip_trivia();
// save the start position of the rule that can be a next def term.
let nxt_def = *self.index(); let nxt_def = *self.index();
match self.parse_rule() { match self.parse_rule() {
Ok((name, rule)) => { Ok((name, rule)) => {
if name == "def" { if name == "def" {
// parse the nxt def term.
self.index = nxt_def; self.index = nxt_def;
return Ok(Term::Def { nam: cur_name, rules, nxt: Box::new(self.parse_term()?) }); return Ok(Term::Def { nam: cur_name, rules, nxt: Box::new(self.parse_term()?) });
} }
if name == cur_name { if name == cur_name {
rules.push(rule); rules.push(rule);
// save the current position.
nxt_term = *self.index(); nxt_term = *self.index();
} else { } else {
let cur = *self.index(); let cur = *self.index();
@ -514,6 +518,7 @@ impl<'a> TermParser<'a> {
return self.with_ctx(Err(msg), nxt_def..cur); return self.with_ctx(Err(msg), nxt_def..cur);
} }
} }
// if failed it is a term.
Err(_) => break self.index = nxt_term, Err(_) => break self.index = nxt_term,
} }
} }

View File

@ -5,12 +5,12 @@ use indexmap::IndexMap;
use crate::fun::{Book, Definition, Name, Pattern, Rule, Term}; use crate::fun::{Book, Definition, Name, Pattern, Rule, Term};
impl Book { impl Book {
pub fn lift_defs(&mut self) { pub fn lift_local_defs(&mut self) {
let mut defs = IndexMap::new(); let mut defs = IndexMap::new();
for (name, def) in self.defs.iter_mut() { for (name, def) in self.defs.iter_mut() {
let mut gen = 0; let mut gen = 0;
for rule in def.rules.iter_mut() { for rule in def.rules.iter_mut() {
rule.body.lift_defs(name, &mut defs, &mut gen); rule.body.lift_local_defs(name, &mut defs, &mut gen);
} }
} }
self.defs.extend(defs); self.defs.extend(defs);
@ -24,14 +24,14 @@ impl Rule {
} }
impl Term { impl Term {
pub fn lift_defs(&mut self, parent: &Name, defs: &mut IndexMap<Name, Definition>, gen: &mut usize) { pub fn lift_local_defs(&mut self, parent: &Name, defs: &mut IndexMap<Name, Definition>, gen: &mut usize) {
match self { match self {
Term::Def { nam, rules, nxt } => { Term::Def { nam, rules, nxt } => {
let local_name = Name::new(format!("{}__local_{}_{}", parent, gen, nam)); let local_name = Name::new(format!("{}__local_{}_{}", parent, gen, nam));
for rule in rules.iter_mut() { for rule in rules.iter_mut() {
rule.body.lift_defs(&local_name, defs, gen); rule.body.lift_local_defs(&local_name, defs, gen);
} }
nxt.lift_defs(parent, defs, gen); nxt.lift_local_defs(parent, defs, gen);
*gen += 1; *gen += 1;
let inner_defs = let inner_defs =
@ -46,7 +46,7 @@ impl Term {
} }
_ => { _ => {
for child in self.children_mut() { for child in self.children_mut() {
child.lift_defs(parent, defs, gen); child.lift_local_defs(parent, defs, gen);
} }
} }
} }

View File

@ -14,7 +14,7 @@ pub mod expand_main;
pub mod fix_match_defs; pub mod fix_match_defs;
pub mod fix_match_terms; pub mod fix_match_terms;
pub mod float_combinators; pub mod float_combinators;
pub mod lift_defs; pub mod lift_local_defs;
pub mod linearize_matches; pub mod linearize_matches;
pub mod linearize_vars; pub mod linearize_vars;
pub mod resolve_refs; pub mod resolve_refs;

View File

@ -90,7 +90,7 @@ pub fn desugar_book(
ctx.set_entrypoint(); ctx.set_entrypoint();
ctx.book.lift_defs(); ctx.book.lift_local_defs();
ctx.book.encode_adts(opts.adt_encoding); ctx.book.encode_adts(opts.adt_encoding);