Add missing error message

This commit is contained in:
imaqtkatt 2024-07-02 09:14:02 -03:00
parent 65065e9038
commit 842891cbf4
6 changed files with 33 additions and 11 deletions

View File

@ -495,27 +495,26 @@ 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];
let mut cur_idx = *self.index(); let mut nxt_term = *self.index();
loop { loop {
self.skip_trivia(); self.skip_trivia();
let back_term = *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" {
self.index = back_term; 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);
cur_idx = *self.index(); nxt_term = *self.index();
} else { } else {
panic!() let cur = *self.index();
let msg = format!("Expected a rule with name '{cur_name}'.");
return self.with_ctx(Err(msg), nxt_def..cur);
} }
} }
Err(_) => { Err(_) => break self.index = nxt_term,
self.index = cur_idx;
break;
}
} }
} }
let nxt = self.parse_term()?; let nxt = self.parse_term()?;

View File

@ -77,13 +77,13 @@ fn gen_use(
fvs.iter().cloned().map(|nam| Term::Var { nam }).collect::<Vec<_>>(), fvs.iter().cloned().map(|nam| Term::Var { nam }).collect::<Vec<_>>(),
); );
let r#use = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: std::mem::take(nxt) };
for rule in rules.iter_mut() { for rule in rules.iter_mut() {
let slf = std::mem::take(&mut rule.body); let slf = std::mem::take(&mut rule.body);
rule.body = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: Box::new(slf) }; rule.body = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: Box::new(slf) };
} }
let r#use = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: std::mem::take(nxt) };
(r#use, fvs, rules) (r#use, fvs, rules)
} }

View File

@ -0,0 +1,5 @@
main =
let base = 0
def aux [] = base
aux (List/Cons head tail) = (+ head (aux tail))
(aux [1, 2, 3])

View File

@ -0,0 +1,5 @@
main =
let base = 0
def aux [] = base
aux2 (List/Cons head tail) = (+ head (aux tail))
(aux [1, 2, 3])

View File

@ -0,0 +1,5 @@
---
source: tests/golden_tests.rs
input_file: tests/golden_tests/parse_file/fun_def.bend
---
(main) = let base = 0; def (aux []) = base(aux (List/Cons head tail)) = (+ head (aux tail))(aux [1, 2, 3])

View File

@ -0,0 +1,8 @@
---
source: tests/golden_tests.rs
input_file: tests/golden_tests/parse_file/fun_def_name.bend
---
Errors:
In tests/golden_tests/parse_file/fun_def_name.bend :
Expected a rule with name 'aux'.
 4 | aux2 (List/Cons head tail) = (+ head (aux tail))