From 92e338861d5ef3623ed7c9d1e374476deea79f5c Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 26 Aug 2018 20:34:43 -0600 Subject: [PATCH] add clean errors for read, re: #45 --- src/prolog/machine/machine_errors.rs | 18 ++++++++++++++++++ src/prolog/machine/machine_state.rs | 10 +++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/prolog/machine/machine_errors.rs b/src/prolog/machine/machine_errors.rs index c23dd49b..eedba0c4 100644 --- a/src/prolog/machine/machine_errors.rs +++ b/src/prolog/machine/machine_errors.rs @@ -58,6 +58,11 @@ impl MachineError { MachineError { stub, from: ErrorProvenance::Constructed } } + pub(super) fn syntax_error(error: SyntaxError) -> Self { + let stub = functor!("syntax_error", 1, [heap_atom!(error.as_str())]); + MachineError { stub, from: ErrorProvenance::Received } + } + pub(super) fn domain_error(error: DomainError, culprit: Addr) -> Self { let stub = functor!("domain_error", 2, [heap_atom!(error.as_str()), HeapCellValue::Addr(culprit)]); @@ -135,6 +140,19 @@ impl ValidType { } } +#[derive(Clone, Copy)] +pub enum SyntaxError { + ImpDepAtom +} + +impl SyntaxError { + pub fn as_str(&self) -> &'static str { + match self { + SyntaxError::ImpDepAtom => "imp_dep_atom" + } + } +} + #[derive(Clone, Copy)] pub enum DomainError { NotLessThanZero diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 6ff632cd..5deef983 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -601,9 +601,13 @@ pub(crate) trait CallPolicy: Any { let addr = reader.machine_st[temp_v!(1)].clone(); reader.machine_st.unify(addr, Addr::HeapCell(offset)); }, - Err(err) => { - println!("{:?}", err); - reader.machine_st.fail = true; + Err(_) => { + // 8.14.1.3 k)-l) + let stub = MachineError::functor_stub(clause_name!("read"), 1); + let err = MachineError::syntax_error(SyntaxError::ImpDepAtom); + let err = reader.machine_st.error_form(err, stub); + + return Err(err); } }; -- 2.54.0