From b05cff30448b36841ee0277f34a120d00fb5b981 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 30 Apr 2019 21:30:28 -0600 Subject: [PATCH] improve matching on partial strings as lists --- Cargo.toml | 2 +- src/prolog/indexing.rs | 15 ++++++++++----- src/prolog/machine/compile.rs | 4 ++-- src/prolog/machine/machine_state_impl.rs | 3 ++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d570da4..7236e498 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scryer-prolog" -version = "0.8.77" +version = "0.8.78" authors = ["Mark Thom "] repository = "https://github.com/mthom/scryer-prolog" description = "A modern Prolog implementation written mostly in Rust." diff --git a/src/prolog/indexing.rs b/src/prolog/indexing.rs index 4cba9d13..81207a33 100644 --- a/src/prolog/indexing.rs +++ b/src/prolog/indexing.rs @@ -58,8 +58,13 @@ impl CodeOffsets { let is_initial_index = self.lists.is_empty(); self.lists.push(Self::add_index(is_initial_index, index)); }, - &Term::Constant(_, Constant::String(_)) - if !self.flags.double_quotes.is_atom() => { // strings are lists in this case. + &Term::Constant(_, Constant::String(ref s)) + if !self.flags.double_quotes.is_atom() && !s.is_empty() => { // strings are lists in this case. + let is_initial_index = self.lists.is_empty(); + self.lists.push(Self::add_index(is_initial_index, index)); + }, + &Term::Constant(_, Constant::String(ref s)) + if !self.flags.double_quotes.is_atom() && s.is_expandable() => { let is_initial_index = self.lists.is_empty(); self.lists.push(Self::add_index(is_initial_index, index)); }, @@ -132,7 +137,7 @@ impl CodeOffsets { _ => IntIndex::Fail } } - + fn switch_on_constant(con_ind: HashMap, prelude: &mut CodeDeque) -> IntIndex { @@ -203,7 +208,7 @@ impl CodeOffsets { match con_loc { IntIndex::External(offset) => offset + prelude_len + 1, IntIndex::Fail => 0, - IntIndex::Internal(offset) => offset, + IntIndex::Internal(offset) => offset, } } @@ -216,7 +221,7 @@ impl CodeOffsets { IntIndex::Internal(_) => prelude_len - lst_offset + 1 } } - + pub fn add_indices(self, code: &mut Code, mut code_body: Code) { if self.no_indices() { diff --git a/src/prolog/machine/compile.rs b/src/prolog/machine/compile.rs index ac60200a..8a0f4326 100644 --- a/src/prolog/machine/compile.rs +++ b/src/prolog/machine/compile.rs @@ -133,8 +133,8 @@ fn compile_decl(wam: &mut Machine, compiler: &mut ListingCompiler, decl: Declara let mut indices = default_index_store!(wam.indices.atom_tbl.clone()); let wam_indices = &mut wam.indices; - compiler.process_decl(decl, &mut wam.code_repo, wam_indices, &mut indices, flags)?; - + compiler.process_decl(decl, &mut wam.code_repo, wam_indices, &mut indices, flags)?; + Ok(indices) } diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index bab156b4..8bcfde78 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -1496,7 +1496,8 @@ impl MachineState { let offset = match addr { Addr::HeapCell(_) | Addr::StackCell(..) | Addr::AttrVar(..) => v, - Addr::Con(Constant::String(_)) if !self.flags.double_quotes.is_atom() => l, + Addr::Con(Constant::String(ref s)) if !self.flags.double_quotes.is_atom() => + if s.is_empty() && !s.is_expandable() { c } else { l }, Addr::Con(_) => c, Addr::Lis(_) => l, Addr::Str(_) => s, -- 2.54.0