From: Mark Thom Date: Tue, 18 Sep 2018 03:16:15 +0000 (-0600) Subject: restore parse_term to toplevel X-Git-Tag: v0.8.110~372 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d0ac258c779460390fbaf41c4e99f0f4fa40dc4a;p=scryer-prolog.git restore parse_term to toplevel --- diff --git a/src/prolog/compile.rs b/src/prolog/compile.rs index a8949429..4eaafc8a 100644 --- a/src/prolog/compile.rs +++ b/src/prolog/compile.rs @@ -271,7 +271,7 @@ fn compile_listing<'a, R: Read>(wam: &mut Machine, src: R, mut indices: MachineC let mut compiler = ListingCompiler::new(); let mut toplevel_results = vec![]; - while let Some(decl) = try_eval_session!(worker.consume(&wam.op_dir, &mut indices)) { + while let Some(decl) = try_eval_session!(worker.consume(wam, &mut indices)) { if decl.is_module_decl() { toplevel_indices.copy_and_swap(&mut indices); mem::swap(&mut worker.results, &mut toplevel_results); diff --git a/src/prolog/instructions.rs b/src/prolog/instructions.rs index d2d6636c..8e5168af 100644 --- a/src/prolog/instructions.rs +++ b/src/prolog/instructions.rs @@ -195,7 +195,7 @@ pub type ModuleCodeDir = HashMap; pub type CodeDir = HashMap; -//pub type TermDir = HashMap; +pub type TermDir = HashMap; pub type ModuleDir = HashMap; diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index 23490747..de4c613f 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -53,7 +53,7 @@ pub struct Machine { code: Code, pub(super) code_dir: Rc>, pub(super) op_dir: OpDir, - // term_dir: TermDir, +// term_dir: TermDir, pub(super) modules: ModuleDir, cached_query: Option } diff --git a/src/prolog/term_writer.rs b/src/prolog/term_writer.rs deleted file mode 100644 index 84cb1498..00000000 --- a/src/prolog/term_writer.rs +++ /dev/null @@ -1,43 +0,0 @@ -use prolog_parser::ast::*; - -use prolog::heap_iter::*; -use prolog::instructions::HeapCellValue; -use prolog::machine::machine_state::MachineState; - -pub fn term_write(machine_st: &'a MachineState, addr: Addr) -> Result { - let pre_order_iter = HCPreOrderIterator::new(machine_st, addr); - let post_order_iter = HCPostOrderIterator::new(pre_order_iter); - let acyclic_post_order_iter = HCAcyclicIterator::new(post_order_iter); - - let mut stack = vec![]; - - for value in acyclic_post_order_iter { - match value { - HeapCellValue::NamedStr(arity, name, fixity) - if stack.len() >= arity => { - let subterms: Vec<_> = stack[stack.len() - arity ..].drain().collect(); - stack.push(Box::new(Term::Clause(Cell::default(), name, subterms, fixity))); - }, - HeapCellValue::Addr(Addr::Con(constant)) => - stack.push(Box::new(Term::Constant(Cell::default(), constant))), - HeapCellValue::Addr(Addr::Lis(_)) - if stack.len() >= 2 => { - let subterms: Vec<_> = stack[stack.len() - 2 ..].drain().collect(); - stack.push(Box::new(Term::Cons(Cell::default(), subterms[0], subterms[1]))); - }, - HeapCellValue::Addr(Addr::HeapCell(h)) => - stack.push(Box::new(Term::Var(Cell::default(), Rc::new(format!("_{}", h))))), - HeapCellValue::Addr(Addr::StackCell(fr, sc)) => - stack.push(Box::new(Term::Var(Cell::default(), Rc::new(format!("_{}_{}", sc, fr))))), - _ => return Err(ParserError::IncompleteReduction) - } - } - - if let Some(term) = stack.pop() { - if stack.is_empty() { - return Ok(term); - } - } - - Err(ParserError::IncompleteReduction) -} diff --git a/src/prolog/toplevel.rs b/src/prolog/toplevel.rs index 27b0ce24..2c752f96 100644 --- a/src/prolog/toplevel.rs +++ b/src/prolog/toplevel.rs @@ -669,6 +669,13 @@ impl RelationWorker { } } +// used to parse queries in test. mostly. +pub fn parse_term(wam: &Machine, buf: R) -> Result +{ + let mut parser = Parser::new(buf, wam.atom_tbl(), wam.machine_flags()); + parser.read_term(composite_op!(&wam.op_dir)) +} + pub fn consume_term<'a>(static_code_dir: Rc>, term: Term, mut indices: MachineCodeIndices<'a>) @@ -710,7 +717,7 @@ impl TopLevelBatchWorker { } pub - fn consume<'a, 'b : 'a>(&mut self, op_dir: &OpDir, indices: &'a mut MachineCodeIndices<'b>) + fn consume<'a, 'b : 'a>(&mut self, wam: &mut Machine, indices: &'a mut MachineCodeIndices<'b>) -> Result, SessionError> { let mut preds = vec![]; @@ -721,7 +728,7 @@ impl TopLevelBatchWorker { self.parser.reset(); // empty the parser stack of token descriptions. let mut new_rel_worker = RelationWorker::new(); - let term = self.read_term(op_dir, &indices.local.op_dir)?; + let term = self.read_term(&wam.op_dir, &indices.local.op_dir)?; let tl = new_rel_worker.try_term_to_tl(&mut indices, term, true)?;