fix ambiguity_check
This commit is contained in:
@@ -53,7 +53,7 @@ pub trait HCValueOutputter {
|
|||||||
fn result(self) -> Self::Output;
|
fn result(self) -> Self::Output;
|
||||||
fn ends_with(&self, &str) -> bool;
|
fn ends_with(&self, &str) -> bool;
|
||||||
fn len(&self) -> usize;
|
fn len(&self) -> usize;
|
||||||
fn truncate(&mut self, usize);
|
fn truncate(&mut self, usize);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PrinterOutputter {
|
pub struct PrinterOutputter {
|
||||||
@@ -151,7 +151,12 @@ pub struct HCPrinter<'a, Outputter> {
|
|||||||
macro_rules! push_space_if_amb {
|
macro_rules! push_space_if_amb {
|
||||||
($self:expr, $atom:expr, $op:expr, $action:block) => (
|
($self:expr, $atom:expr, $op:expr, $action:block) => (
|
||||||
match $self.ambiguity_check($atom, $op) {
|
match $self.ambiguity_check($atom, $op) {
|
||||||
Some(DirectedOp::Left(..)) => {
|
Some(DirectedOp::Left(_, false)) => {
|
||||||
|
$self.outputter.push_char(' ');
|
||||||
|
$action;
|
||||||
|
},
|
||||||
|
Some(DirectedOp::Left(lop, true)) => {
|
||||||
|
$self.outputter.insert_from_end(lop.as_str().len(), ' ');
|
||||||
$self.outputter.push_char(' ');
|
$self.outputter.push_char(' ');
|
||||||
$action;
|
$action;
|
||||||
},
|
},
|
||||||
@@ -254,29 +259,6 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
|
|||||||
ignore_ops: false }
|
ignore_ops: false }
|
||||||
}
|
}
|
||||||
|
|
||||||
// return op itself if there is an ambiguity to indicate the direction the op
|
|
||||||
// lies, None otherwise.
|
|
||||||
fn ambiguity_check(&mut self, atom: &str, op: &Option<DirectedOp>) -> Option<DirectedOp>
|
|
||||||
{
|
|
||||||
match op {
|
|
||||||
&Some(DirectedOp::Left(ref lop, false)) if continues_with_append(lop.as_str(), atom) =>
|
|
||||||
Some(DirectedOp::Left(lop.clone(), false)),
|
|
||||||
&Some(DirectedOp::Left(ref lop, true)) =>
|
|
||||||
if self.outputter.ends_with(&format!(" {}", lop.as_str())) {
|
|
||||||
Some(DirectedOp::Left(lop.clone(), true))
|
|
||||||
} else if continues_with_append(lop.as_str(), atom) {
|
|
||||||
self.outputter.insert_from_end(lop.as_str().len(), ' ');
|
|
||||||
Some(DirectedOp::Left(lop.clone(), true))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
},
|
|
||||||
&Some(DirectedOp::Right(ref rop)) if continues_with_append(atom, rop.as_str()) =>
|
|
||||||
Some(DirectedOp::Right(rop.clone())),
|
|
||||||
_ =>
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_heap_locs(machine_st: &'a MachineState, output: Outputter,
|
pub fn from_heap_locs(machine_st: &'a MachineState, output: Outputter,
|
||||||
heap_locs: &'a HeapVarDict)
|
heap_locs: &'a HeapVarDict)
|
||||||
-> Self
|
-> Self
|
||||||
@@ -294,6 +276,29 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// return op itself if there is an ambiguity to indicate the direction the op
|
||||||
|
// lies, None otherwise.
|
||||||
|
fn ambiguity_check(&self, atom: &str, op: &Option<DirectedOp>) -> Option<DirectedOp>
|
||||||
|
{
|
||||||
|
match op {
|
||||||
|
&Some(DirectedOp::Left(ref lop, false)) if continues_with_append(lop.as_str(), atom) =>
|
||||||
|
Some(DirectedOp::Left(lop.clone(), false)),
|
||||||
|
&Some(DirectedOp::Left(ref lop, true)) =>
|
||||||
|
if self.outputter.ends_with(&format!(" {}", lop.as_str())) {
|
||||||
|
Some(DirectedOp::Left(lop.clone(), false))
|
||||||
|
} else if continues_with_append(lop.as_str(), atom) {
|
||||||
|
Some(DirectedOp::Left(lop.clone(), true))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
&Some(DirectedOp::Right(ref rop)) if continues_with_append(atom, rop.as_str()) =>
|
||||||
|
Some(DirectedOp::Right(rop.clone())),
|
||||||
|
_ =>
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn enqueue_op(&mut self, ct: ClauseType, fixity: Fixity) {
|
fn enqueue_op(&mut self, ct: ClauseType, fixity: Fixity) {
|
||||||
match fixity {
|
match fixity {
|
||||||
Fixity::Post => {
|
Fixity::Post => {
|
||||||
@@ -449,7 +454,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
|
|||||||
if self.outputter.ends_with(&format!(" {}", op.as_str())) {
|
if self.outputter.ends_with(&format!(" {}", op.as_str())) {
|
||||||
self.outputter.push_char(' ');
|
self.outputter.push_char(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
self.outputter.push_char('(');
|
self.outputter.push_char('(');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -547,10 +552,10 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
|
|||||||
|
|
||||||
if let Some(ref op) = op {
|
if let Some(ref op) = op {
|
||||||
self.state_stack.push(TokenOrRedirect::Open);
|
self.state_stack.push(TokenOrRedirect::Open);
|
||||||
|
|
||||||
if self.outputter.ends_with(&format!(" {}", op.as_str())) {
|
if self.outputter.ends_with(&format!(" {}", op.as_str())) {
|
||||||
self.state_stack.push(TokenOrRedirect::Space);
|
self.state_stack.push(TokenOrRedirect::Space);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
HeapCellValue::NamedStr(0, name, fixity) =>
|
HeapCellValue::NamedStr(0, name, fixity) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user