diff --git a/src/parse.rs b/src/parse.rs index d6ad60c..8013c4f 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -5,7 +5,7 @@ mod names; mod terms; pub(crate) use helpers::word_boundary; -pub(crate) use literals::{boolean, integer}; +pub(crate) use literals::{boolean, integer, special_integer}; pub use names::{function_or_predicate_name, variable_name}; pub use terms::term; pub use formulas::formula; diff --git a/src/parse/literals.rs b/src/parse/literals.rs index 98c89c2..f80c013 100644 --- a/src/parse/literals.rs +++ b/src/parse/literals.rs @@ -72,9 +72,45 @@ pub fn integer(i: &str) -> IResult<&str, i32> )(i) } +fn infimum(i: &str) -> IResult<&str, crate::SpecialInteger> +{ + map + ( + terminated + ( + tag("#inf"), + word_boundary, + ), + |_| crate::SpecialInteger::Infimum, + )(i) +} + +fn supremum(i: &str) -> IResult<&str, crate::SpecialInteger> +{ + map + ( + terminated + ( + tag("#sup"), + word_boundary, + ), + |_| crate::SpecialInteger::Supremum, + )(i) +} + +pub fn special_integer(i: &str) -> IResult<&str, crate::SpecialInteger> +{ + alt + (( + infimum, + supremum, + ))(i) +} + #[cfg(test)] mod tests { + use crate::SpecialInteger; use crate::parse::*; #[test] @@ -117,4 +153,28 @@ mod tests assert!(integer("-").is_err()); assert!(integer(" ").is_err()); } + + #[test] + fn parse_special_integer() + { + assert_eq!(special_integer("#inf"), Ok(("", SpecialInteger::Infimum))); + assert_eq!(special_integer("#sup"), Ok(("", SpecialInteger::Supremum))); + assert_eq!(special_integer("#inf #sup"), Ok((" #sup", SpecialInteger::Infimum))); + assert_eq!(special_integer("#sup #inf"), Ok((" #inf", SpecialInteger::Supremum))); + assert_eq!(special_integer("#inf,"), Ok((",", SpecialInteger::Infimum))); + assert_eq!(special_integer("#sup,"), Ok((",", SpecialInteger::Supremum))); + assert!(special_integer("#inf0").is_err()); + assert!(special_integer("#sup0").is_err()); + assert!(special_integer("#infimum").is_err()); + assert!(special_integer("#supremum").is_err()); + assert!(special_integer("inf").is_err()); + assert!(special_integer("sup").is_err()); + assert!(special_integer("0").is_err()); + assert!(special_integer("10000").is_err()); + assert!(special_integer("-10000").is_err()); + assert!(special_integer("-").is_err()); + assert!(special_integer("+").is_err()); + assert!(special_integer("a").is_err()); + assert!(special_integer(" ").is_err()); + } } diff --git a/src/parse/terms.rs b/src/parse/terms.rs index 3384d22..f870828 100644 --- a/src/parse/terms.rs +++ b/src/parse/terms.rs @@ -9,7 +9,8 @@ use nom:: sequence::{delimited, pair, preceded, terminated}, }; -use super::{Declarations, boolean, function_or_predicate_name, integer, variable_name, word_boundary}; +use super::{Declarations, boolean, function_or_predicate_name, integer, special_integer, + variable_name, word_boundary}; fn negative<'i>(i: &'i str, d: &Declarations) -> IResult<&'i str, crate::Term> { @@ -57,41 +58,6 @@ fn absolute_value<'i>(i: &'i str, d: &Declarations) -> IResult<&'i str, crate::T )(i) } -fn infimum(i: &str) -> IResult<&str, crate::Term> -{ - map - ( - terminated - ( - tag("#inf"), - word_boundary, - ), - |_| crate::Term::infimum(), - )(i) -} - -fn supremum(i: &str) -> IResult<&str, crate::Term> -{ - map - ( - terminated - ( - tag("#sup"), - word_boundary, - ), - |_| crate::Term::supremum(), - )(i) -} - -pub fn special_integer(i: &str) -> IResult<&str, crate::Term> -{ - alt - (( - infimum, - supremum, - ))(i) -} - pub fn string(i: &str) -> IResult<&str, crate::Term> { map @@ -260,7 +226,11 @@ fn term_precedence_0<'a>(i: &'a str, d: &Declarations) -> IResult<&'a str, crate boolean, crate::Term::Boolean, ), - special_integer, + map + ( + special_integer, + crate::Term::SpecialInteger, + ), map ( integer, @@ -766,30 +736,6 @@ mod tests assert_eq!(format_term("f( \n a \n + \n b \n , \n c \n + \n d \n)"), "f(a + b, c + d)"); } - #[test] - fn parse_special_integer() - { - assert_eq!(special_integer("#inf"), Ok(("", Term::infimum()))); - assert_eq!(special_integer("#sup"), Ok(("", Term::supremum()))); - assert_eq!(special_integer("#inf #sup"), Ok((" #sup", Term::infimum()))); - assert_eq!(special_integer("#sup #inf"), Ok((" #inf", Term::supremum()))); - assert_eq!(special_integer("#inf,"), Ok((",", Term::infimum()))); - assert_eq!(special_integer("#sup,"), Ok((",", Term::supremum()))); - assert!(special_integer("#inf0").is_err()); - assert!(special_integer("#sup0").is_err()); - assert!(special_integer("#infimum").is_err()); - assert!(special_integer("#supremum").is_err()); - assert!(special_integer("inf").is_err()); - assert!(special_integer("sup").is_err()); - assert!(special_integer("0").is_err()); - assert!(special_integer("10000").is_err()); - assert!(special_integer("-10000").is_err()); - assert!(special_integer("-").is_err()); - assert!(special_integer("+").is_err()); - assert!(special_integer("a").is_err()); - assert!(special_integer(" ").is_err()); - } - #[test] fn parse_string() {