use nom:: { IResult, branch::alt, bytes::complete::tag, character::complete::digit1, combinator::{map, map_res, opt, recognize}, sequence::pair, }; pub fn integer(i: &str) -> IResult<&str, crate::Term> { map ( map_res ( recognize ( pair ( opt ( alt (( tag("-"), tag("+"), )) ), digit1, ) ), std::str::FromStr::from_str, ), crate::Term::integer, )(i) } fn infimum(i: &str) -> IResult<&str, crate::Term> { map ( tag("#inf"), |_| crate::Term::infimum(), )(i) } fn supremum(i: &str) -> IResult<&str, crate::Term> { map ( tag("#sup"), |_| crate::Term::supremum(), )(i) } pub fn special_integer(i: &str) -> IResult<&str, crate::Term> { alt (( infimum, supremum, ))(i) } /* fn string<'a>(i: &'a str, declarations: &Declarations) -> IResult<&'a str, crate::Term> { map ( delimited ( multispace0, delimited ( tag("\""), is_not("\""), tag("\""), ), multispace0 ), |s: &str| crate::Term::String(s.to_string()) )(i) } fn function<'a>(i: &'a str, declarations: &Declarations) -> IResult<&'a str, crate::Formula> { alt (( function_n_ary, function_0_ary ))(i) } fn function_0_ary<'a>(i: &'a str, declarations: &Declarations) -> IResult<&'a str, crate::Term> { map ( delimited(multispace0, function_identifier, multispace0), |name| crate::Formula::function( crate::FunctionDeclaration { name: name, arity: 0, }, vec![]) )(i) } fn function_n_ary<'a>(i: &'a str, declarations: &Declarations) -> IResult<&'a str, crate::Term> { map ( pair ( delimited(multispace0, function_identifier, multispace0), delimited ( multispace0, delimited ( tag("("), separated_list(tag(","), term), tag(")") ), multispace0 ) ), |(name, arguments)| crate::Formula::function( crate::PredicateDeclaration { name: name, arity: arguments.len(), }, arguments) )(i) } */ #[cfg(test)] mod tests { use crate::parse::*; #[test] fn parse_integer() { assert_eq!(integer("0"), Ok(("", crate::Term::integer(0)))); assert_eq!(integer("10000"), Ok(("", crate::Term::integer(10000)))); assert_eq!(integer("-10000"), Ok(("", crate::Term::integer(-10000)))); assert_eq!(integer("1.5"), Ok((".5", crate::Term::integer(1)))); assert!(integer("a").is_err()); assert!(integer("-").is_err()); assert!(integer(" ").is_err()); } #[test] fn parse_special_integer() { assert_eq!(special_integer("#inf"), Ok(("", crate::Term::infimum()))); assert_eq!(special_integer("#sup"), Ok(("", crate::Term::supremum()))); 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()); } }