From be7b8d3cad7328f1c7aead51b27bf1008c8d5856 Mon Sep 17 00:00:00 2001 From: Nicolas Abril Date: Sat, 15 Jun 2024 18:57:36 +0200 Subject: [PATCH] Fix parsing of hvm defs --- src/fun/parser.rs | 51 ++++++++++++------- tests/golden_tests/run_file/hvm_def_cast.bend | 1 + .../run_file/hvm_def_two_defs.bend | 8 +++ .../run_file__hvm_def_two_defs.bend.snap | 9 ++++ 4 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 tests/golden_tests/run_file/hvm_def_two_defs.bend create mode 100644 tests/snapshots/run_file__hvm_def_two_defs.bend.snap diff --git a/src/fun/parser.rs b/src/fun/parser.rs index 33f747bf..95d5144f 100644 --- a/src/fun/parser.rs +++ b/src/fun/parser.rs @@ -109,7 +109,7 @@ impl<'a> TermParser<'a> { let (r#enum, nxt_indent) = prs.parse_type(indent)?; self.index = prs.index; let end_idx = *self.index(); - self.add_type(r#enum, &mut book, ini_idx..end_idx, builtin)?; + self.add_imp_type(r#enum, &mut book, ini_idx..end_idx, builtin)?; indent = nxt_indent; last_rule = None; continue; @@ -118,7 +118,7 @@ impl<'a> TermParser<'a> { self.index = rewind_index; let (nam, adt) = self.parse_datatype(builtin)?; let end_idx = *self.index(); - self.with_ctx(book.add_adt(nam, adt), ini_idx..end_idx)?; + self.add_fun_type(&mut book, nam, adt, ini_idx..end_idx)?; indent = self.advance_newlines()?; last_rule = None; continue; @@ -130,6 +130,9 @@ impl<'a> TermParser<'a> { let def = self.parse_hvm(builtin)?; let end_idx = *self.index(); self.add_hvm(def, &mut book, ini_idx..end_idx)?; + indent = self.advance_newlines()?; + last_rule = None; + continue; } // Fun function definition @@ -774,7 +777,13 @@ impl<'a> TermParser<'a> { Ok(()) } - fn add_type(&mut self, enum_: Enum, book: &mut Book, span: Range, builtin: bool) -> ParseResult<()> { + fn add_imp_type( + &mut self, + enum_: Enum, + book: &mut Book, + span: Range, + builtin: bool, + ) -> ParseResult<()> { self.check_type_redefinition(&enum_.name, book, span.clone())?; let mut adt = Adt { ctrs: Default::default(), builtin }; for variant in enum_.variants { @@ -786,6 +795,25 @@ impl<'a> TermParser<'a> { Ok(()) } + fn add_fun_type(&mut self, book: &mut Book, nam: Name, adt: Adt, span: Range) -> ParseResult<()> { + if book.adts.contains_key(&nam) { + let msg = TermParser::redefinition_of_type_msg(&nam); + return self.with_ctx(Err(msg), span); + } else { + for ctr in adt.ctrs.keys() { + match book.ctrs.entry(ctr.clone()) { + indexmap::map::Entry::Vacant(e) => _ = e.insert(nam.clone()), + indexmap::map::Entry::Occupied(e) => { + let msg = TermParser::redefinition_of_constructor_msg(e.key()); + return self.with_ctx(Err(msg), span); + } + } + } + book.adts.insert(nam.clone(), adt); + } + Ok(()) + } + fn add_object( &mut self, obj: Variant, @@ -917,22 +945,7 @@ impl Indent { } } -impl Book { - fn add_adt(&mut self, nam: Name, adt: Adt) -> ParseResult<()> { - if self.adts.contains_key(&nam) { - Err(TermParser::redefinition_of_type_msg(&nam))? - } else { - for ctr in adt.ctrs.keys() { - match self.ctrs.entry(ctr.clone()) { - indexmap::map::Entry::Vacant(e) => _ = e.insert(nam.clone()), - indexmap::map::Entry::Occupied(e) => Err(TermParser::redefinition_of_constructor_msg(e.key()))?, - } - } - self.adts.insert(nam.clone(), adt); - } - Ok(()) - } -} +impl Book {} impl<'a> ParserCommons<'a> for TermParser<'a> {} diff --git a/tests/golden_tests/run_file/hvm_def_cast.bend b/tests/golden_tests/run_file/hvm_def_cast.bend index 79ec4957..0fb66229 100644 --- a/tests/golden_tests/run_file/hvm_def_cast.bend +++ b/tests/golden_tests/run_file/hvm_def_cast.bend @@ -1,3 +1,4 @@ +# Expected +42.0 hvm to_f24: ($([f24] a) a) diff --git a/tests/golden_tests/run_file/hvm_def_two_defs.bend b/tests/golden_tests/run_file/hvm_def_two_defs.bend new file mode 100644 index 00000000..3c8e7133 --- /dev/null +++ b/tests/golden_tests/run_file/hvm_def_two_defs.bend @@ -0,0 +1,8 @@ +# Expected result: -0.349 +hvm log_: + (x ($([|] $(x ret)) ret)) + +hvm atan2_: + ($([&] $(y ret)) (y ret)) + +main = (log_ (atan2_ 1.0 1.0) 2.0) \ No newline at end of file diff --git a/tests/snapshots/run_file__hvm_def_two_defs.bend.snap b/tests/snapshots/run_file__hvm_def_two_defs.bend.snap new file mode 100644 index 00000000..2ade08f4 --- /dev/null +++ b/tests/snapshots/run_file__hvm_def_two_defs.bend.snap @@ -0,0 +1,9 @@ +--- +source: tests/golden_tests.rs +input_file: tests/golden_tests/run_file/hvm_def_two_defs.bend +--- +NumScott: +-0.349 + +Scott: +-0.349