From dc04708796c563cde8e4b422031f2f97be0d9d44 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 29 Aug 2018 21:20:56 -0600 Subject: [PATCH] split error classification --- src/prolog/ast.rs | 1 + src/prolog/parser | 2 +- src/prolog/read.rs | 25 +++++++++++++++---------- 3 files changed, 17 insertions(+), 11 deletions(-) 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; }, _ => {} -- 2.54.0