]> Repositorios git - scryer-prolog.git/commitdiff
add string table, StringList representation
authorMark Thom <[email protected]>
Tue, 21 Aug 2018 06:22:16 +0000 (00:22 -0600)
committerMark Thom <[email protected]>
Tue, 21 Aug 2018 06:22:16 +0000 (00:22 -0600)
src/prolog/ast.rs
src/prolog/compile.rs
src/prolog/heap_print.rs
src/prolog/io.rs
src/prolog/machine/machine_state.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/machine/mod.rs
src/prolog/parser
src/prolog/read.rs
src/prolog/string_list.rs
src/prolog/toplevel.rs

index 54eee85eb2d0380b22ff07da5028ee69ce1eca00..c1f98da070913e7c067c105269d853539f3c6ddd 100644 (file)
@@ -2,6 +2,7 @@ use prolog::num::bigint::BigInt;
 use prolog::num::{Float, ToPrimitive, Zero};
 use prolog::num::rational::Ratio;
 use prolog::ordered_float::*;
+use prolog::string_list::*;
 use prolog::tabled_rc::*;
 
 use std::cell::{Cell, RefCell};
@@ -531,7 +532,7 @@ pub enum Constant {
     Atom(ClauseName),
     Char(char),
     Number(Number),
-    String(TabledRc<String>),
+    String(StringList),
     Usize(usize),
     EmptyList
 }
index ba326864e5d6c8d3be595b3b4046cc5fac2b9731..d751a03ce7f7a23353cc423bc9b39b7238819163 100644 (file)
@@ -38,12 +38,14 @@ fn print_code(code: &Code) {
 pub fn parse_code(wam: &mut Machine, buffer: &str) -> Result<TopLevelPacket, ParserError>
 {
     let atom_tbl = wam.atom_tbl();
+    let string_tbl = wam.string_tbl();
+    
     let index = MachineCodeIndices {
         code_dir: &mut wam.code_dir,
         op_dir: &mut wam.op_dir,
     };
 
-    let mut worker = TopLevelWorker::new(buffer.as_bytes(), atom_tbl, index);
+    let mut worker = TopLevelWorker::new(buffer.as_bytes(), atom_tbl, string_tbl, index);
     worker.parse_code()
 }
 
@@ -239,7 +241,7 @@ fn use_qualified_module(module: &mut Option<Module>, submodule: &Module, exports
 pub
 fn compile_listing(wam: &mut Machine, src_str: &str, mut indices: MachineCodeIndices) -> EvalSession
 {
-    let mut worker   = TopLevelBatchWorker::new(src_str.as_bytes(), wam.atom_tbl());
+    let mut worker   = TopLevelBatchWorker::new(src_str.as_bytes(), wam.atom_tbl(), wam.string_tbl());
     let mut compiler = ListingCompiler::new(wam);
 
     while let Some(decl) = try_eval_session!(worker.consume(&mut indices)) {
index 6bbe4ef80775d35a192e0f4a18bd23dcff712562..ba4f5d9d20487ab4cbdd895c740145273d4ba9b2 100644 (file)
@@ -324,7 +324,7 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter>
                 self.outputter.append(&format!("{}", n)),
             Constant::String(s) => {
                 self.outputter.append("\"");
-                self.outputter.append(s.as_str());
+                self.outputter.append(s.borrow().as_str());
                 self.outputter.append("\"");
             },
             Constant::Usize(i) =>
index 4df60064ae27d06a5a4c7a4f8f7f734e0462ac1e..d9eb51229b427c32b2bf46b47685cf08ef4913df 100644 (file)
@@ -44,7 +44,7 @@ impl fmt::Display for Constant {
             &Constant::Number(ref n) =>
                 write!(f, "{}", n),
             &Constant::String(ref s) =>
-                write!(f, "\"{}\"", s),
+                write!(f, "\"{}\"", s.borrow()),
             &Constant::Usize(integer) =>
                 write!(f, "u{}", integer)
         }
index 6403de19766a9267c63f6a82364850a56f7f5e87..fe406fccd665157114b7ce7e17733407550e66c4 100644 (file)
@@ -6,6 +6,7 @@ use prolog::machine::machine_errors::*;
 use prolog::num::{BigInt, BigUint, Zero, One};
 use prolog::or_stack::*;
 use prolog::read::*;
+use prolog::string_list::*;
 use prolog::tabled_rc::*;
 
 use downcast::Any;
@@ -288,6 +289,7 @@ impl Default for MachineFlags {
 
 pub struct MachineState {
     pub(crate) atom_tbl: TabledData<Atom>,
+    pub(crate) string_tbl: TabledData<StringListWrapper>,
     pub(super) s: usize,
     pub(super) p: CodePtr,
     pub(super) b: usize,
index a0101fd5b5d6ac1e4946b6aff730b40e310b7337..e5218063eb66ea5c43c454cdc3e7abf78705b626 100644 (file)
@@ -9,8 +9,8 @@ use prolog::num::{Integer, Signed, ToPrimitive, Zero};
 use prolog::num::bigint::{BigInt, BigUint};
 use prolog::num::rational::Ratio;
 use prolog::or_stack::*;
-use prolog::tabled_rc::*;
 
+use std::cell::RefCell;
 use std::cmp::{max, Ordering};
 use std::collections::{HashMap, HashSet};
 use std::rc::Rc;
@@ -28,9 +28,10 @@ macro_rules! try_or_fail {
 }
 
 impl MachineState {
-    pub(super) fn new(atom_tbl: TabledData<Atom>) -> MachineState {
+    pub(super) fn new() -> Self {
         MachineState {
-            atom_tbl,
+            atom_tbl: Rc::new(RefCell::new(HashSet::new())),
+            string_tbl: Rc::new(RefCell::new(HashSet::new())),
             s: 0,
             p: CodePtr::default(),
             b: 0,
index d37f00550a67f1db0873ec1f2df3c7dcc8e1a40e..62c17f5c1c257b1bd77c7dae2ebbadd13d9eb58b 100644 (file)
@@ -1,6 +1,7 @@
 use prolog::ast::*;
 use prolog::compile::*;
 use prolog::heap_print::*;
+use prolog::string_list::StringListWrapper;
 use prolog::tabled_rc::*;
 
 mod machine_errors;
@@ -11,8 +12,7 @@ mod system_calls;
 
 use prolog::machine::machine_state::*;
 
-use std::cell::RefCell;
-use std::collections::{HashMap, HashSet};
+use std::collections::HashMap;
 use std::mem::swap;
 use std::ops::Index;
 use std::rc::Rc;
@@ -99,7 +99,7 @@ static QUEUES: &str  = include_str!("../lib/queues.pl");
 impl Machine {
     pub fn new() -> Self {
         let mut wam = Machine {
-            ms: MachineState::new(Rc::new(RefCell::new(HashSet::new()))),
+            ms: MachineState::new(),
             call_policy: Box::new(DefaultCallPolicy {}),
             cut_policy: Box::new(DefaultCutPolicy {}),
             code: Code::new(),
@@ -177,6 +177,10 @@ impl Machine {
         self.ms.atom_tbl.clone()
     }
 
+    pub fn string_tbl(&self) -> TabledData<StringListWrapper> {
+        self.ms.string_tbl.clone()
+    }
+    
     pub fn use_qualified_module_in_toplevel(&mut self, name: ClauseName, exports: Vec<PredicateKey>)
                                             -> EvalSession
     {
index 0d10b8e4b736f54940b58cf111ac1f3290b29340..6d995645d57849f0f16f8ce50c124e8875c9e76b 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 0d10b8e4b736f54940b58cf111ac1f3290b29340
+Subproject commit 6d995645d57849f0f16f8ce50c124e8875c9e76b
index 03280b469e06ffbbebd669fc8b1ff5396f504768..713152dbadbe6e97e23744742b5acc06de78cc8a 100644 (file)
@@ -33,7 +33,10 @@ impl<'a> Reader<'a> {
         let stdin = stdin();
         stdin.read_line(&mut buffer).unwrap();
 
-        let mut parser = Parser::new(buffer.as_bytes(), self.machine_st.atom_tbl.clone());
+        let atom_tbl = self.machine_st.atom_tbl.clone();
+        let string_tbl = self.machine_st.string_tbl.clone();
+        
+        let mut parser = Parser::new(buffer.as_bytes(), atom_tbl, string_tbl);
         Ok(self.write_term_to_heap(parser.read_term(op_dir)?))
     }
 
index 3c1dc63ae66c0ff830fa6e9d48660a1bab967ee2..c8956aed103cc3da3388776ae8169013f0e81d1a 100644 (file)
@@ -3,7 +3,6 @@ use prolog::tabled_rc::*;
 use std::cell::{Ref, RefCell};
 use std::cmp::Ordering;
 use std::hash::{Hash, Hasher};
-use std::ops::{Index, RangeTo};
 
 #[derive(PartialOrd, PartialEq, Ord, Eq)]
 pub struct StringListWrapper(RefCell<String>);
index 9419905e78b8a2d3039cd2d730ac1edb57a5bc7d..8eb80c31267c25c6a9c6f9835fdc887e5030deab 100644 (file)
@@ -2,6 +2,7 @@ use prolog::ast::*;
 use prolog::machine::*;
 use prolog::num::*;
 use prolog::parser::parser::*;
+use prolog::string_list::*;
 use prolog::tabled_rc::*;
 
 use std::collections::{HashSet, VecDeque};
@@ -606,8 +607,11 @@ pub struct TopLevelWorker<'a, R: Read> {
 }
 
 impl<'a, R: Read> TopLevelWorker<'a, R> {
-    pub fn new(inner: R, atom_tbl: TabledData<Atom>, indices: MachineCodeIndices<'a>) -> Self {
-        TopLevelWorker { parser: Parser::new(inner, atom_tbl), indices }
+    pub fn new(inner: R, atom_tbl: TabledData<Atom>, string_tbl: TabledData<StringListWrapper>,
+               indices: MachineCodeIndices<'a>)
+               -> Self
+    {
+        TopLevelWorker { parser: Parser::new(inner, atom_tbl, string_tbl), indices }
     }
 
     pub fn parse_code(&mut self) -> Result<TopLevelPacket, ParserError>
@@ -636,8 +640,10 @@ pub struct TopLevelBatchWorker<R: Read> {
 }
 
 impl<R: Read> TopLevelBatchWorker<R> {
-    pub fn new(inner: R, atom_tbl: TabledData<Atom>) -> Self {
-        TopLevelBatchWorker { parser: Parser::new(inner, atom_tbl),
+    pub fn new(inner: R, atom_tbl: TabledData<Atom>, string_tbl: TabledData<StringListWrapper>)
+               -> Self
+    {
+        TopLevelBatchWorker { parser: Parser::new(inner, atom_tbl, string_tbl),
                               rel_worker: RelationWorker::new(),
                               source_mod: clause_name!("user"),
                               results: vec![] }