correct conformity test #234

This commit is contained in:
Mark Thom
2019-04-07 12:14:20 -06:00
parent 8963936f0c
commit e9c8d6adb9
2 changed files with 21 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "scryer-prolog" name = "scryer-prolog"
version = "0.8.49" version = "0.8.50"
authors = ["Mark Thom <markjordanthom@gmail.com>"] authors = ["Mark Thom <markjordanthom@gmail.com>"]
repository = "https://github.com/mthom/scryer-prolog" repository = "https://github.com/mthom/scryer-prolog"
description = "A modern Prolog implementation written mostly in Rust." description = "A modern Prolog implementation written mostly in Rust."

View File

@@ -281,8 +281,8 @@ macro_rules! push_space_if_amb {
fn requires_space(atom: &str, op: &str) -> bool { fn requires_space(atom: &str, op: &str) -> bool {
match atom.chars().last() { match atom.chars().last() {
Some(ac) => op.chars().next().map(|oc| { Some(ac) => op.chars().next().map(|oc| {
if alpha_char!(ac) { if alpha_numeric_char!(ac) {
alpha_numeric_char!(oc) oc == '(' || alpha_numeric_char!(oc)
} else if graphic_token_char!(ac) { } else if graphic_token_char!(ac) {
graphic_token_char!(oc) graphic_token_char!(oc)
} else if variable_indicator_char!(ac) { } else if variable_indicator_char!(ac) {
@@ -423,14 +423,14 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
self.state_stack.push(TokenOrRedirect::CompositeRedirect(left_directed_op)); self.state_stack.push(TokenOrRedirect::CompositeRedirect(left_directed_op));
self.state_stack.push(TokenOrRedirect::Op(ct.name(), spec)); self.state_stack.push(TokenOrRedirect::Op(ct.name(), spec));
} else { // if is_infix!(spec.assoc()) } else { // if is_infix!(spec.assoc())
match ct.name().as_str() { match ct.name().as_str() {
"|" => { "|" => {
self.format_infix_op_with_space(ct.name(), spec); self.format_infix_op_with_space(ct.name(), spec);
return; return;
}, },
_ => {} _ => {}
}; };
let left_directed_op = DirectedOp::Left(ct.name(), spec.clone()); let left_directed_op = DirectedOp::Left(ct.name(), spec.clone());
let right_directed_op = DirectedOp::Right(ct.name(), spec.clone()); let right_directed_op = DirectedOp::Right(ct.name(), spec.clone());
@@ -677,19 +677,25 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
fn print_constant(&mut self, c: Constant, op: &Option<DirectedOp>) { fn print_constant(&mut self, c: Constant, op: &Option<DirectedOp>) {
match c { match c {
Constant::Atom(ref atom, Some(ref spec)) if spec.prec() > 0 => { Constant::Atom(ref atom, Some(ref spec)) if spec.prec() > 0 => {
let mut result = String::new();
if let Some(ref op) = op { if let Some(ref op) = op {
if self.outputter.ends_with(&format!(" {}", op.as_str())) { if self.outputter.ends_with(&format!(" {}", op.as_str())) {
self.push_char(' '); result.push(' ');
} }
self.push_char('('); result.push('(');
} }
self.print_atom(atom); result += &self.print_op_addendum(atom.as_str());
if op.is_some() { if op.is_some() {
self.push_char(')'); result.push(')');
} }
push_space_if_amb!(self, &result, {
self.append_str(&result);
});
}, },
Constant::Atom(ref atom, _) => Constant::Atom(ref atom, _) =>
push_space_if_amb!(self, atom.as_str(), { push_space_if_amb!(self, atom.as_str(), {
@@ -800,6 +806,12 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
if add_brackets { if add_brackets {
self.state_stack.push(TokenOrRedirect::Open); self.state_stack.push(TokenOrRedirect::Open);
if let Some(ref op) = &op {
if requires_space(op.as_str(), "(") {
self.state_stack.push(TokenOrRedirect::Space);
}
}
} }
}, },
HeapCellValue::NamedStr(0, name, fixity) => HeapCellValue::NamedStr(0, name, fixity) =>