From: Mark Thom Date: Thu, 30 Aug 2018 03:20:56 +0000 (-0600) Subject: split error classification X-Git-Tag: v0.8.110~414 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=dc04708796c563cde8e4b422031f2f97be0d9d44;p=scryer-prolog.git split error classification --- diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index f8e0a385..693c98e6 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -499,6 +499,7 @@ pub enum ParserError InvalidUseModuleDecl, InvalidModuleResolution, MissingQuote, + NonPrologChar, ParseBigInt, ParseFloat, Utf8Conversion(Utf8Error) diff --git a/src/prolog/parser b/src/prolog/parser index f367d551..0df920d5 160000 --- a/src/prolog/parser +++ b/src/prolog/parser @@ -1 +1 @@ -Subproject commit f367d551e23d22b9514abecff7dc8182b7e04055 +Subproject commit 0df920d5a89da22921423f35263f4b61ce576c28 diff --git a/src/prolog/read.rs b/src/prolog/read.rs index 1e37d799..ced9bd2d 100644 --- a/src/prolog/read.rs +++ b/src/prolog/read.rs @@ -31,14 +31,19 @@ impl<'a> Reader<'a> { let mut buffer = String::new(); let stdin = stdin(); - stdin.read_line(&mut buffer).unwrap(); - - let atom_tbl = self.machine_st.atom_tbl.clone(); - let string_tbl = self.machine_st.string_tbl.clone(); let flags = self.machine_st.machine_flags(); - - let mut parser = Parser::new(buffer.as_bytes(), atom_tbl, string_tbl, flags); - Ok(self.write_term_to_heap(parser.read_term(op_dir)?)) + + loop { + stdin.read_line(&mut buffer).unwrap(); + let mut parser = Parser::new(buffer.as_bytes(), self.machine_st.atom_tbl.clone(), + self.machine_st.string_tbl.clone(), flags); + + match parser.read_term(op_dir) { + Err(ParserError::UnexpectedEOF) => continue, + Err(e) => return Err(e), + Ok(term) => return Ok(self.write_term_to_heap(term)) + }; + } } fn push_stub_addr(&mut self) { @@ -66,7 +71,7 @@ impl<'a> Reader<'a> { let h = self.machine_st.heap.h; match &term { - &TermRef::Cons(lvl, ..) => { + &TermRef::Cons(lvl, ..) => { queue.push_back((2, h+1)); self.machine_st.heap.push(HeapCellValue::Addr(Addr::Lis(h+1))); @@ -105,12 +110,12 @@ impl<'a> Reader<'a> { } else { var_dict.insert(var.clone(), Addr::HeapCell(site_h)); } - + if arity > 1 { queue.push_front((arity - 1, site_h + 1)); } } - + continue; }, _ => {}