Fix parsing precedence of left implication vs. less-than comparison

This commit is contained in:
Patrick Lühne 2020-04-20 02:40:13 +02:00
parent 04e2d61583
commit ba385868cb
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
2 changed files with 57 additions and 39 deletions

View File

@ -4,7 +4,7 @@ use nom::
branch::alt, branch::alt,
bytes::complete::tag, bytes::complete::tag,
character::complete::multispace0, character::complete::multispace0,
combinator::{cut, map, map_res}, combinator::{cut, map, map_res, peek},
multi::{many1, separated_list1}, multi::{many1, separated_list1},
sequence::{delimited, pair, preceded, terminated, tuple}, sequence::{delimited, pair, preceded, terminated, tuple},
}; };
@ -286,39 +286,43 @@ where
delimited delimited
( (
multispace0, multispace0,
alt terminated
(( (
map alt
( ((
tag("<="), map
|_| crate::ComparisonOperator::LessOrEqual, (
), tag("<="),
map |_| crate::ComparisonOperator::LessOrEqual,
( ),
tag(">="), map
|_| crate::ComparisonOperator::GreaterOrEqual, (
), tag(">="),
map |_| crate::ComparisonOperator::GreaterOrEqual,
( ),
tag(">"), map
|_| crate::ComparisonOperator::Greater, (
), tag("<"),
map |_| crate::ComparisonOperator::Less,
( ),
tag("<"), map
|_| crate::ComparisonOperator::Less, (
), tag(">"),
map |_| crate::ComparisonOperator::Greater,
( ),
tag("!="), map
|_| crate::ComparisonOperator::NotEqual, (
), tag("!="),
map |_| crate::ComparisonOperator::NotEqual,
( ),
tag("="), map
|_| crate::ComparisonOperator::Equal, (
), tag("="),
)), |_| crate::ComparisonOperator::Equal,
),
)),
peek(nom::combinator::not(tag("-"))),
),
multispace0, multispace0,
), ),
|i| crate::parse::term(i, d, v), |i| crate::parse::term(i, d, v),
@ -381,13 +385,13 @@ where
), ),
map map
( (
|i| predicate(i, d, v), |i| compare(i, d, v),
crate::Formula::Predicate, crate::Formula::Compare,
), ),
map map
( (
|i| compare(i, d, v), |i| predicate(i, d, v),
crate::Formula::Compare, crate::Formula::Predicate,
), ),
|i| formula_parenthesized(i, d, v), |i| formula_parenthesized(i, d, v),
))(i) ))(i)
@ -535,6 +539,15 @@ mod tests
assert_eq!(format_formula("(a <- b <- c) <-> (d <- e <- f)"), "a <- b <- c <-> d <- e <- f"); assert_eq!(format_formula("(a <- b <- c) <-> (d <- e <- f)"), "a <- b <- c <-> d <- e <- f");
} }
#[test]
fn parse_compare()
{
assert_eq!(format_formula("X >= 0"), "X >= 0");
assert_eq!(format_formula("N >= 0"), "N >= 0");
assert_eq!(format_formula("n < 0"), "n < 0");
assert_eq!(format_formula("n >= 0"), "n >= 0");
}
#[test] #[test]
fn parse_exists() fn parse_exists()
{ {

View File

@ -489,12 +489,17 @@ mod tests
assert_eq!(term_as_function("s").declaration.name, "s"); assert_eq!(term_as_function("s").declaration.name, "s");
assert_eq!(term_as_function("s").declaration.arity, 0); assert_eq!(term_as_function("s").declaration.arity, 0);
assert!(term_as_function("s").arguments.is_empty());
assert_eq!(term_as_function("s()").declaration.name, "s"); assert_eq!(term_as_function("s()").declaration.name, "s");
assert_eq!(term_as_function("s").declaration.arity, 0); assert_eq!(term_as_function("s()").declaration.arity, 0);
assert!(term_as_function("s()").arguments.is_empty());
assert_eq!(term_as_function("s(1, 2, 3)").declaration.name, "s"); assert_eq!(term_as_function("s(1, 2, 3)").declaration.name, "s");
assert_eq!(term_as_function("s(1, 2, 3)").declaration.arity, 3); assert_eq!(term_as_function("s(1, 2, 3)").declaration.arity, 3);
assert_eq!(term_as_function("s(1, 2, 3)").arguments.len(), 3);
assert_eq!(term_as_function("s(1, 2, 3)").arguments.remove(0), Term::integer(1)); assert_eq!(term_as_function("s(1, 2, 3)").arguments.remove(0), Term::integer(1));
assert_eq!(term_as_function("s(1, 2, 3)").arguments.remove(2), Term::integer(3)); assert_eq!(term_as_function("s(1, 2, 3)").arguments.remove(2), Term::integer(3));
assert_eq!(format_term("n"), "n");
} }
#[test] #[test]