Format code using 'cargo fmt'
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
use prolog_parser::ast::*;
|
||||
use prolog_parser::parser::*;
|
||||
|
||||
use prolog::machine::*;
|
||||
use prolog::machine::machine_indices::HeapCellValue;
|
||||
use prolog::rug::Integer;
|
||||
use prolog::machine::*;
|
||||
use prolog::rug::ops::Pow;
|
||||
use prolog::rug::Integer;
|
||||
|
||||
use std::cell::Cell;
|
||||
use std::collections::VecDeque;
|
||||
@@ -12,8 +12,7 @@ use std::io::Read;
|
||||
use std::iter::Rev;
|
||||
use std::vec::IntoIter;
|
||||
|
||||
fn unfold_by_str_once(term: &mut Term, s: &str) -> Option<(Term, Term)>
|
||||
{
|
||||
fn unfold_by_str_once(term: &mut Term, s: &str) -> Option<(Term, Term)> {
|
||||
if let &mut Term::Clause(_, ref name, ref mut subterms, _) = term {
|
||||
if name.as_str() == s && subterms.len() == 2 {
|
||||
let snd = *subterms.pop().unwrap();
|
||||
@@ -26,8 +25,7 @@ fn unfold_by_str_once(term: &mut Term, s: &str) -> Option<(Term, Term)>
|
||||
None
|
||||
}
|
||||
|
||||
pub fn unfold_by_str(mut term: Term, s: &str) -> Vec<Term>
|
||||
{
|
||||
pub fn unfold_by_str(mut term: Term, s: &str) -> Vec<Term> {
|
||||
let mut terms = vec![];
|
||||
|
||||
while let Some((fst, snd)) = unfold_by_str_once(&mut term, s) {
|
||||
@@ -40,22 +38,24 @@ pub fn unfold_by_str(mut term: Term, s: &str) -> Vec<Term>
|
||||
}
|
||||
|
||||
pub fn fold_by_str<I>(terms: I, mut term: Term, sym: ClauseName) -> Term
|
||||
where I: DoubleEndedIterator<Item=Term>
|
||||
where
|
||||
I: DoubleEndedIterator<Item = Term>,
|
||||
{
|
||||
for prec in terms.rev() {
|
||||
term = Term::Clause(Cell::default(), sym.clone(),
|
||||
vec![Box::new(prec), Box::new(term)],
|
||||
None);
|
||||
term = Term::Clause(
|
||||
Cell::default(),
|
||||
sym.clone(),
|
||||
vec![Box::new(prec), Box::new(term)],
|
||||
None,
|
||||
);
|
||||
}
|
||||
|
||||
term
|
||||
}
|
||||
|
||||
fn extract_from_list(head: Box<Term>, tail: Box<Term>)
|
||||
-> Result<Rev<IntoIter<Term>>, ParserError>
|
||||
{
|
||||
fn extract_from_list(head: Box<Term>, tail: Box<Term>) -> Result<Rev<IntoIter<Term>>, ParserError> {
|
||||
let mut terms = vec![*head];
|
||||
let mut tail = *tail;
|
||||
let mut tail = *tail;
|
||||
|
||||
while let Term::Cons(_, head, next_tail) = tail {
|
||||
terms.push(*head);
|
||||
@@ -81,19 +81,19 @@ pub struct TermStream<'a, R: Read> {
|
||||
|
||||
pub struct ExpansionAdditionResult {
|
||||
term_expansion_additions: (Predicate, VecDeque<TopLevel>),
|
||||
goal_expansion_additions: (Predicate, VecDeque<TopLevel>)
|
||||
goal_expansion_additions: (Predicate, VecDeque<TopLevel>),
|
||||
}
|
||||
|
||||
impl ExpansionAdditionResult {
|
||||
pub fn take_term_expansions(&mut self) -> (Predicate, VecDeque<TopLevel>) {
|
||||
let tes = mem::replace(&mut self.term_expansion_additions.0, Predicate::new());
|
||||
let tes = mem::replace(&mut self.term_expansion_additions.0, Predicate::new());
|
||||
let teqs = mem::replace(&mut self.term_expansion_additions.1, VecDeque::from(vec![]));
|
||||
|
||||
(tes, teqs)
|
||||
}
|
||||
|
||||
pub fn take_goal_expansions(&mut self) -> (Predicate, VecDeque<TopLevel>) {
|
||||
let ges = mem::replace(&mut self.goal_expansion_additions.0, Predicate::new());
|
||||
let ges = mem::replace(&mut self.goal_expansion_additions.0, Predicate::new());
|
||||
let geqs = mem::replace(&mut self.goal_expansion_additions.1, VecDeque::from(vec![]));
|
||||
|
||||
(ges, geqs)
|
||||
@@ -109,17 +109,24 @@ impl<'a, R: Read> Drop for TermStream<'a, R> {
|
||||
}
|
||||
|
||||
impl<'a, R: Read> TermStream<'a, R> {
|
||||
pub fn new(src: &'a mut ParsingStream<R>, atom_tbl: TabledData<Atom>, flags: MachineFlags, wam: &'a mut Machine)
|
||||
-> Self
|
||||
{
|
||||
pub fn new(
|
||||
src: &'a mut ParsingStream<R>,
|
||||
atom_tbl: TabledData<Atom>,
|
||||
flags: MachineFlags,
|
||||
wam: &'a mut Machine,
|
||||
) -> Self {
|
||||
TermStream {
|
||||
stack: Vec::new(),
|
||||
term_expansion_lens: wam.code_repo.term_dir_entry_len((clause_name!("term_expansion"), 2)),
|
||||
goal_expansion_lens: wam.code_repo.term_dir_entry_len((clause_name!("goal_expansion"), 2)),
|
||||
term_expansion_lens: wam
|
||||
.code_repo
|
||||
.term_dir_entry_len((clause_name!("term_expansion"), 2)),
|
||||
goal_expansion_lens: wam
|
||||
.code_repo
|
||||
.term_dir_entry_len((clause_name!("goal_expansion"), 2)),
|
||||
wam,
|
||||
parser: Parser::new(src, atom_tbl, flags),
|
||||
in_module: false,
|
||||
flags
|
||||
flags,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,11 +141,11 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
CompileTimeHook::UserTermExpansion => {
|
||||
self.term_expansion_lens.0 += len;
|
||||
self.term_expansion_lens.1 += queue_len;
|
||||
},
|
||||
}
|
||||
CompileTimeHook::UserGoalExpansion => {
|
||||
self.goal_expansion_lens.0 += len;
|
||||
self.goal_expansion_lens.1 += queue_len;
|
||||
},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -169,27 +176,34 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
Ok(self.stack.is_empty() && self.parser.eof()?)
|
||||
}
|
||||
|
||||
pub fn rollback_expansion_code(&mut self) -> Result<ExpansionAdditionResult, ParserError>
|
||||
{
|
||||
pub fn rollback_expansion_code(&mut self) -> Result<ExpansionAdditionResult, ParserError> {
|
||||
let te_len = self.term_expansion_lens.0;
|
||||
let te_queue_len = self.term_expansion_lens.1;
|
||||
|
||||
let ge_len = self.goal_expansion_lens.0;
|
||||
let ge_queue_len = self.goal_expansion_lens.1;
|
||||
|
||||
let term_expansion_additions =
|
||||
self.wam.code_repo.truncate_terms((clause_name!("term_expansion"), 2),
|
||||
te_len, te_queue_len);
|
||||
let goal_expansion_additions =
|
||||
self.wam.code_repo.truncate_terms((clause_name!("goal_expansion"), 2),
|
||||
ge_len, ge_queue_len);
|
||||
let term_expansion_additions = self.wam.code_repo.truncate_terms(
|
||||
(clause_name!("term_expansion"), 2),
|
||||
te_len,
|
||||
te_queue_len,
|
||||
);
|
||||
let goal_expansion_additions = self.wam.code_repo.truncate_terms(
|
||||
(clause_name!("goal_expansion"), 2),
|
||||
ge_len,
|
||||
ge_queue_len,
|
||||
);
|
||||
|
||||
self.wam.code_repo.compile_hook(CompileTimeHook::TermExpansion, self.flags)?;
|
||||
self.wam.code_repo.compile_hook(CompileTimeHook::GoalExpansion, self.flags)?;
|
||||
self.wam
|
||||
.code_repo
|
||||
.compile_hook(CompileTimeHook::TermExpansion, self.flags)?;
|
||||
self.wam
|
||||
.code_repo
|
||||
.compile_hook(CompileTimeHook::GoalExpansion, self.flags)?;
|
||||
|
||||
Ok(ExpansionAdditionResult {
|
||||
term_expansion_additions,
|
||||
goal_expansion_additions
|
||||
goal_expansion_additions,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -198,34 +212,37 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
Term::Cons(_, head, tail) => {
|
||||
let iter = extract_from_list(head, tail)?;
|
||||
Ok(self.stack.extend(iter))
|
||||
},
|
||||
Term::Clause(..) | Term::Constant(_, Constant::Atom(..)) =>
|
||||
Ok(self.stack.push(term)),
|
||||
_ =>
|
||||
Err(ParserError::ExpectedTopLevelTerm)
|
||||
}
|
||||
Term::Clause(..) | Term::Constant(_, Constant::Atom(..)) => Ok(self.stack.push(term)),
|
||||
_ => Err(ParserError::ExpectedTopLevelTerm),
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_expansion_output(&self, term_string: &str, op_dir: &OpDir) -> Result<Term, ParserError>
|
||||
{
|
||||
fn parse_expansion_output(
|
||||
&self,
|
||||
term_string: &str,
|
||||
op_dir: &OpDir,
|
||||
) -> Result<Term, ParserError> {
|
||||
let mut stream = parsing_stream(term_string.trim().as_bytes());
|
||||
let mut parser = Parser::new(&mut stream, self.parser.get_atom_tbl(), self.flags);
|
||||
|
||||
parser.read_term(composite_op!(self.in_module, &self.wam.indices.op_dir, op_dir))
|
||||
parser.read_term(composite_op!(
|
||||
self.in_module,
|
||||
&self.wam.indices.op_dir,
|
||||
op_dir
|
||||
))
|
||||
}
|
||||
|
||||
pub fn read_term(&mut self, op_dir: &OpDir) -> Result<Term, ParserError>
|
||||
{
|
||||
pub fn read_term(&mut self, op_dir: &OpDir) -> Result<Term, ParserError> {
|
||||
let mut machine_st = MachineState::new();
|
||||
|
||||
loop {
|
||||
while let Some(term) = self.stack.pop() {
|
||||
match machine_st.try_expand_term(self.wam, &term, CompileTimeHook::TermExpansion)
|
||||
{
|
||||
match machine_st.try_expand_term(self.wam, &term, CompileTimeHook::TermExpansion) {
|
||||
Some(term_string) => {
|
||||
let term = self.parse_expansion_output(term_string.as_str(), op_dir)?;
|
||||
self.enqueue_term(term)?
|
||||
},
|
||||
}
|
||||
None => {
|
||||
let term = self.run_goal_expanders(&mut machine_st, op_dir, term)?;
|
||||
return Ok(term);
|
||||
@@ -234,16 +251,21 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
}
|
||||
|
||||
self.parser.reset();
|
||||
let term = self.parser.read_term(composite_op!(self.in_module, &self.wam.indices.op_dir,
|
||||
op_dir))?;
|
||||
let term = self.parser.read_term(composite_op!(
|
||||
self.in_module,
|
||||
&self.wam.indices.op_dir,
|
||||
op_dir
|
||||
))?;
|
||||
self.stack.push(term);
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate)
|
||||
fn run_goal_expanders(&mut self, machine_st: &mut MachineState, op_dir: &OpDir, term: Term)
|
||||
-> Result<Term, ParserError>
|
||||
{
|
||||
pub(crate) fn run_goal_expanders(
|
||||
&mut self,
|
||||
machine_st: &mut MachineState,
|
||||
op_dir: &OpDir,
|
||||
term: Term,
|
||||
) -> Result<Term, ParserError> {
|
||||
match term {
|
||||
Term::Clause(cell, name, mut terms, arity) => {
|
||||
let mut new_terms = {
|
||||
@@ -251,45 +273,50 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
(":-", 2) => {
|
||||
let comma_term = *terms.pop().unwrap();
|
||||
unfold_by_str(comma_term, ",")
|
||||
},
|
||||
}
|
||||
("?-", 1) => unfold_by_str(*terms.pop().unwrap(), ","),
|
||||
_ => return Ok(Term::Clause(cell, name, terms, arity))
|
||||
_ => return Ok(Term::Clause(cell, name, terms, arity)),
|
||||
};
|
||||
|
||||
self.expand_goals(machine_st, op_dir, VecDeque::from(old_terms))?
|
||||
};
|
||||
|
||||
let initial_term = new_terms.pop().unwrap();
|
||||
terms.push(Box::new(fold_by_str(new_terms.into_iter(), initial_term,
|
||||
clause_name!(","))));
|
||||
terms.push(Box::new(fold_by_str(
|
||||
new_terms.into_iter(),
|
||||
initial_term,
|
||||
clause_name!(","),
|
||||
)));
|
||||
Ok(Term::Clause(cell, name, terms, arity))
|
||||
},
|
||||
_ =>
|
||||
Ok(term)
|
||||
}
|
||||
_ => Ok(term),
|
||||
}
|
||||
}
|
||||
|
||||
fn expand_goals(&mut self, machine_st: &mut MachineState, op_dir: &OpDir, mut terms: VecDeque<Term>)
|
||||
-> Result<Vec<Term>, ParserError>
|
||||
{
|
||||
fn expand_goals(
|
||||
&mut self,
|
||||
machine_st: &mut MachineState,
|
||||
op_dir: &OpDir,
|
||||
mut terms: VecDeque<Term>,
|
||||
) -> Result<Vec<Term>, ParserError> {
|
||||
let mut results = vec![];
|
||||
|
||||
while let Some(term) = terms.pop_front() {
|
||||
match machine_st.try_expand_term(self.wam, &term, CompileTimeHook::GoalExpansion)
|
||||
{
|
||||
match machine_st.try_expand_term(self.wam, &term, CompileTimeHook::GoalExpansion) {
|
||||
Some(term_string) => {
|
||||
println!("trying to goal expand {}", term_string);
|
||||
let term = self.parse_expansion_output(term_string.as_str(), op_dir)?;
|
||||
|
||||
match term {
|
||||
Term::Cons(_, head, tail) =>
|
||||
Term::Cons(_, head, tail) => {
|
||||
for term in extract_from_list(head, tail)? {
|
||||
terms.push_front(term);
|
||||
},
|
||||
term => terms.push_front(term)
|
||||
}
|
||||
}
|
||||
term => terms.push_front(term),
|
||||
};
|
||||
},
|
||||
None => results.push(term)
|
||||
}
|
||||
None => results.push(term),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,9 +325,7 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
}
|
||||
|
||||
impl MachineState {
|
||||
pub(super)
|
||||
fn print_with_locs(&self, addr: Addr, op_dir: &OpDir) -> PrinterOutputter
|
||||
{
|
||||
pub(super) fn print_with_locs(&self, addr: Addr, op_dir: &OpDir) -> PrinterOutputter {
|
||||
let output = PrinterOutputter::new();
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, op_dir, output);
|
||||
let mut max_var_length = 0;
|
||||
@@ -327,9 +352,12 @@ impl MachineState {
|
||||
output
|
||||
}
|
||||
|
||||
fn try_expand_term(&mut self, wam: &mut Machine, term: &Term, hook: CompileTimeHook)
|
||||
-> Option<String>
|
||||
{
|
||||
fn try_expand_term(
|
||||
&mut self,
|
||||
wam: &mut Machine,
|
||||
term: &Term,
|
||||
hook: CompileTimeHook,
|
||||
) -> Option<String> {
|
||||
let term_write_result = write_term_to_heap(term, self);
|
||||
let h = self.heap.h;
|
||||
|
||||
@@ -340,7 +368,12 @@ impl MachineState {
|
||||
let code = vec![call_clause!(ClauseType::Hook(hook), 2, 0, true)];
|
||||
|
||||
wam.code_repo.cached_query = code;
|
||||
self.query_stepper(&mut wam.indices, &mut wam.policies, &mut wam.code_repo, &mut readline::input_stream());
|
||||
self.query_stepper(
|
||||
&mut wam.indices,
|
||||
&mut wam.policies,
|
||||
&mut wam.code_repo,
|
||||
&mut readline::input_stream(),
|
||||
);
|
||||
|
||||
if self.fail {
|
||||
self.reset();
|
||||
|
||||
Reference in New Issue
Block a user