From 33d1a7c70195542bfba13730d6efaa034a8a60b5 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 4 Sep 2018 21:20:45 -0600 Subject: [PATCH] add structural tests for partial strings, rename ast.rs --- Cargo.lock | 6 ++++-- src/main.rs | 2 +- src/prolog/allocator.rs | 2 +- src/prolog/and_stack.rs | 2 +- src/prolog/arithmetic.rs | 2 +- src/prolog/codegen.rs | 2 +- src/prolog/compile.rs | 2 +- src/prolog/copier.rs | 2 +- src/prolog/debray_allocator.rs | 2 +- src/prolog/fixtures.rs | 2 +- src/prolog/heap_iter.rs | 2 +- src/prolog/heap_print.rs | 2 +- src/prolog/indexing.rs | 3 +-- src/prolog/{ast.rs => instructions.rs} | 0 src/prolog/io.rs | 2 +- src/prolog/iterators.rs | 2 +- src/prolog/machine/machine_errors.rs | 2 +- src/prolog/machine/machine_state.rs | 2 +- src/prolog/machine/machine_state_impl.rs | 18 +++++++++++++++--- src/prolog/machine/mod.rs | 2 +- src/prolog/machine/system_calls.rs | 2 +- src/prolog/mod.rs | 2 +- src/prolog/or_stack.rs | 2 +- src/prolog/read.rs | 2 +- src/prolog/targets.rs | 2 +- src/prolog/toplevel.rs | 2 +- src/tests.rs | 5 ++++- 27 files changed, 46 insertions(+), 30 deletions(-) rename src/prolog/{ast.rs => instructions.rs} (100%) diff --git a/Cargo.lock b/Cargo.lock index a33c62b1..6fe939ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,7 +86,8 @@ dependencies = [ [[package]] name = "prolog_parser" -version = "0.7.9" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ordered-float 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -112,7 +113,7 @@ dependencies = [ "downcast 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ordered-float 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prolog_parser 0.7.9", + "prolog_parser 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -151,6 +152,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070" "checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe" "checksum ordered-float 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "58d25b6c0e47b20d05226d288ff434940296e7e2f8b877975da32f862152241f" +"checksum prolog_parser 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "277adc8aef82e87336a642a9bbd480cac9550e5ec63c99465eed7cbc7c165808" "checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" diff --git a/src/main.rs b/src/main.rs index 2c53b5ff..3c880a62 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ #[macro_use] extern crate prolog_parser; extern crate termion; -use prolog::ast::*; +use prolog::instructions::*; mod prolog; diff --git a/src/prolog/allocator.rs b/src/prolog/allocator.rs index cf645681..a6c74dd5 100644 --- a/src/prolog/allocator.rs +++ b/src/prolog/allocator.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::fixtures::*; use prolog::targets::*; diff --git a/src/prolog/and_stack.rs b/src/prolog/and_stack.rs index fdf22c29..e012b631 100644 --- a/src/prolog/and_stack.rs +++ b/src/prolog/and_stack.rs @@ -1,4 +1,4 @@ -use prolog::ast::*; +use prolog::instructions::*; use std::ops::{Index, IndexMut}; use std::vec::Vec; diff --git a/src/prolog/arithmetic.rs b/src/prolog/arithmetic.rs index b91df8f0..a3cdc5f6 100644 --- a/src/prolog/arithmetic.rs +++ b/src/prolog/arithmetic.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use std::cell::Cell; use std::cmp::{min, max}; use std::rc::Rc; diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index becf6e71..47ee1b6e 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::allocator::*; use prolog::arithmetic::*; use prolog::fixtures::*; diff --git a/src/prolog/compile.rs b/src/prolog/compile.rs index ca151441..0b9330c0 100644 --- a/src/prolog/compile.rs +++ b/src/prolog/compile.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::debray_allocator::*; use prolog::codegen::*; use prolog::machine::*; diff --git a/src/prolog/copier.rs b/src/prolog/copier.rs index 6ac18b6a..ffb689a3 100644 --- a/src/prolog/copier.rs +++ b/src/prolog/copier.rs @@ -1,5 +1,5 @@ -use prolog::ast::*; use prolog::and_stack::*; +use prolog::instructions::*; use std::ops::IndexMut; diff --git a/src/prolog/debray_allocator.rs b/src/prolog/debray_allocator.rs index 88a40a02..549cbb33 100644 --- a/src/prolog/debray_allocator.rs +++ b/src/prolog/debray_allocator.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::allocator::*; use prolog::targets::*; diff --git a/src/prolog/fixtures.rs b/src/prolog/fixtures.rs index c2ee7e3f..ffdf8da5 100644 --- a/src/prolog/fixtures.rs +++ b/src/prolog/fixtures.rs @@ -1,8 +1,8 @@ use prolog_parser::ast::*; +use prolog::instructions::*; use prolog::iterators::*; -use prolog::ast::*; use std::cell::Cell; use std::collections::{BTreeMap, HashMap}; use std::collections::btree_map::{IntoIter, IterMut, Values}; diff --git a/src/prolog/heap_iter.rs b/src/prolog/heap_iter.rs index 5ce1c543..1428edf3 100644 --- a/src/prolog/heap_iter.rs +++ b/src/prolog/heap_iter.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::machine::machine_state::*; use std::collections::HashSet; diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 4af86934..c4750c0d 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::machine::machine_state::*; use prolog::num::*; use prolog::heap_iter::*; diff --git a/src/prolog/indexing.rs b/src/prolog/indexing.rs index 2da72058..151a5fcf 100644 --- a/src/prolog/indexing.rs +++ b/src/prolog/indexing.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use std::collections::{HashMap, VecDeque}; use std::hash::Hash; use std::rc::Rc; @@ -217,7 +217,6 @@ impl CodeOffsets { IntIndex::Internal(_) => prelude_len - lst_offset + 1 } } - pub fn add_indices(self, code: &mut Code, mut code_body: Code) { diff --git a/src/prolog/ast.rs b/src/prolog/instructions.rs similarity index 100% rename from src/prolog/ast.rs rename to src/prolog/instructions.rs diff --git a/src/prolog/io.rs b/src/prolog/io.rs index f1ff550e..6f7671c6 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -1,4 +1,4 @@ -use prolog::ast::*; +use prolog::instructions::*; use prolog::heap_print::*; use prolog::machine::*; diff --git a/src/prolog/iterators.rs b/src/prolog/iterators.rs index 1eff90f9..6b2c83b1 100644 --- a/src/prolog/iterators.rs +++ b/src/prolog/iterators.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use std::cell::Cell; use std::collections::VecDeque; use std::iter::*; diff --git a/src/prolog/machine/machine_errors.rs b/src/prolog/machine/machine_errors.rs index d5907b7f..066dde16 100644 --- a/src/prolog/machine/machine_errors.rs +++ b/src/prolog/machine/machine_errors.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::machine::machine_state::*; use prolog::num::bigint::BigInt; diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 7432e599..fe6c9287 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -1,7 +1,7 @@ use prolog_parser::ast::*; use prolog_parser::tabled_rc::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::and_stack::*; use prolog::copier::*; use prolog::heap_print::*; diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 942b491c..4791f512 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -1,7 +1,7 @@ use prolog_parser::ast::*; use prolog_parser::string_list::StringList; -use prolog::ast::*; +use prolog::instructions::*; use prolog::and_stack::*; use prolog::copier::*; use prolog::heap_iter::*; @@ -1528,10 +1528,22 @@ impl MachineState { return Ordering::Greater, (HeapCellValue::Addr(Addr::Con(Constant::String(_))), HeapCellValue::Addr(Addr::Con(Constant::Number(_)))) => - return Ordering::Greater, + return Ordering::Greater, (HeapCellValue::Addr(Addr::Con(Constant::String(s1))), HeapCellValue::Addr(Addr::Con(Constant::String(s2)))) => - return s1.cmp(&s2), + return if s1.is_expandable() { + if s2.is_expandable() { + s1.cmp(&s2) + } else { + Ordering::Greater + } + } else { + if s2.is_expandable() { + Ordering::Less + } else { + s1.cmp(&s2) + } + }, (HeapCellValue::Addr(Addr::Con(Constant::String(_))), _) => return Ordering::Less, (HeapCellValue::Addr(Addr::Con(Constant::Atom(..))), diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index 7cf011fe..8d7e1ef9 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -1,7 +1,7 @@ use prolog_parser::ast::*; use prolog_parser::tabled_rc::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::compile::*; use prolog::heap_print::*; diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 451c99e6..acb3af34 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::machine::machine_errors::*; use prolog::machine::machine_state::*; use prolog::num::{ToPrimitive, Zero}; diff --git a/src/prolog/mod.rs b/src/prolog/mod.rs index ffc4de43..1e137abb 100644 --- a/src/prolog/mod.rs +++ b/src/prolog/mod.rs @@ -2,7 +2,7 @@ extern crate num; extern crate ordered_float; extern crate prolog_parser; -#[macro_use] pub mod ast; +#[macro_use] pub mod instructions; pub mod and_stack; #[macro_use] pub mod macros; #[macro_use] pub mod allocator; diff --git a/src/prolog/or_stack.rs b/src/prolog/or_stack.rs index d32c490f..6fda0971 100644 --- a/src/prolog/or_stack.rs +++ b/src/prolog/or_stack.rs @@ -1,4 +1,4 @@ -use prolog::ast::*; +use prolog::instructions::*; use std::ops::{Index, IndexMut}; use std::vec::Vec; diff --git a/src/prolog/read.rs b/src/prolog/read.rs index 1f4bd4eb..ffba2635 100644 --- a/src/prolog/read.rs +++ b/src/prolog/read.rs @@ -1,7 +1,7 @@ use prolog_parser::ast::*; use prolog_parser::parser::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::iterators::*; use prolog::machine::machine_state::*; diff --git a/src/prolog/targets.rs b/src/prolog/targets.rs index 9eaa2a34..094e0f40 100644 --- a/src/prolog/targets.rs +++ b/src/prolog/targets.rs @@ -1,6 +1,6 @@ use prolog_parser::ast::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::iterators::*; pub trait CompilationTarget<'a> { diff --git a/src/prolog/toplevel.rs b/src/prolog/toplevel.rs index 266b153f..aaef8bfa 100644 --- a/src/prolog/toplevel.rs +++ b/src/prolog/toplevel.rs @@ -2,7 +2,7 @@ use prolog_parser::ast::*; use prolog_parser::parser::*; use prolog_parser::tabled_rc::*; -use prolog::ast::*; +use prolog::instructions::*; use prolog::iterators::*; use prolog::machine::*; use prolog::num::*; diff --git a/src/tests.rs b/src/tests.rs index aef15b7e..ea844659 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,7 +1,7 @@ use prolog_parser::ast::*; -use prolog::ast::*; use prolog::heap_print::*; +use prolog::instructions::*; use prolog::compile::*; use prolog::machine::*; @@ -1936,4 +1936,7 @@ fn test_queries_on_string_lists() assert_prolog_failure!(&mut wam, "?- partial_string(\"abc\", X), partial_string(\"ababc\", Y), Y = [a,b|Z], X == Z."); + assert_prolog_success!(&mut wam, "?- partial_string(\"abc\", X), X @> \"abc\"."); + assert_prolog_failure!(&mut wam, "?- partial_string(\"abc\", X), X \\=@= \"abc\"."); + assert_prolog_failure!(&mut wam, "?- partial_string(\"abc\", X), X @< \"abc\"."); } -- 2.54.0