From 29ea4578e46db60b8221e43a802f31982c437016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Fri, 27 Mar 2020 03:00:09 +0100 Subject: [PATCH] Move boolean parser to separate module --- src/parse.rs | 2 ++ src/parse/formulas.rs | 62 ++++---------------------------------- src/parse/literals.rs | 69 +++++++++++++++++++++++++++++++++++++++++++ src/parse/terms.rs | 61 ++++---------------------------------- 4 files changed, 83 insertions(+), 111 deletions(-) create mode 100644 src/parse/literals.rs diff --git a/src/parse.rs b/src/parse.rs index 9026b2e..1fc7eea 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,9 +1,11 @@ mod formulas; mod helpers; +mod literals; mod names; mod terms; pub(crate) use helpers::word_boundary; +pub(crate) use literals::boolean; pub use names::{function_or_predicate_name, variable_name}; pub use terms::term; pub use formulas::formula; diff --git a/src/parse/formulas.rs b/src/parse/formulas.rs index eb8f9f2..2966ed4 100644 --- a/src/parse/formulas.rs +++ b/src/parse/formulas.rs @@ -9,43 +9,7 @@ use nom:: sequence::{delimited, pair, preceded, terminated, tuple}, }; -use super::{Declarations, word_boundary}; - -// TODO: avoid code duplication -fn true_(i: &str) -> IResult<&str, crate::Formula> -{ - map - ( - terminated - ( - tag("true"), - word_boundary, - ), - |_| crate::Formula::true_(), - )(i) -} - -fn false_(i: &str) -> IResult<&str, crate::Formula> -{ - map - ( - terminated - ( - tag("false"), - word_boundary, - ), - |_| crate::Formula::false_(), - )(i) -} - -pub fn boolean(i: &str) -> IResult<&str, crate::Formula> -{ - alt - (( - true_, - false_, - ))(i) -} +use super::{Declarations, boolean, word_boundary}; pub fn predicate<'i>(i: &'i str, d: &Declarations) -> IResult<&'i str, crate::Predicate> { @@ -394,7 +358,11 @@ fn formula_precedence_0<'a>(i: &'a str, d: &Declarations) -> IResult<&'a str, cr { alt (( - boolean, + map + ( + boolean, + crate::Formula::Boolean, + ), map ( |i| predicate(i, d), @@ -513,24 +481,6 @@ mod tests assert_eq!(formula("false"), Formula::false_()); }*/ - #[test] - fn parse_boolean() - { - assert_eq!(boolean("true"), Ok(("", Formula::true_()))); - assert_eq!(boolean("false"), Ok(("", Formula::false_()))); - assert_eq!(boolean("true false"), Ok((" false", Formula::true_()))); - assert_eq!(boolean("false true"), Ok((" true", Formula::false_()))); - assert_eq!(boolean("true,"), Ok((",", Formula::true_()))); - assert_eq!(boolean("false,"), Ok((",", Formula::false_()))); - assert!(boolean("truefalse").is_err()); - assert!(boolean("falsetrue").is_err()); - assert!(boolean("truea").is_err()); - assert!(boolean("falsea").is_err()); - assert!(boolean("a").is_err()); - assert!(boolean("-").is_err()); - assert!(boolean(" ").is_err()); - } - #[test] fn parse_predicate() { diff --git a/src/parse/literals.rs b/src/parse/literals.rs new file mode 100644 index 0000000..ca7c084 --- /dev/null +++ b/src/parse/literals.rs @@ -0,0 +1,69 @@ +use nom:: +{ + IResult, + branch::alt, + bytes::complete::tag, + combinator::map, + sequence::terminated, +}; + +use super::word_boundary; + +fn true_(i: &str) -> IResult<&str, bool> +{ + map + ( + terminated + ( + tag("true"), + word_boundary, + ), + |_| true, + )(i) +} + +fn false_(i: &str) -> IResult<&str, bool> +{ + map + ( + terminated + ( + tag("false"), + word_boundary, + ), + |_| false, + )(i) +} + +pub fn boolean(i: &str) -> IResult<&str, bool> +{ + alt + (( + true_, + false_, + ))(i) +} + +#[cfg(test)] +mod tests +{ + use crate::parse::*; + + #[test] + fn parse_boolean() + { + assert_eq!(boolean("true"), Ok(("", true))); + assert_eq!(boolean("false"), Ok(("", false))); + assert_eq!(boolean("true false"), Ok((" false", true))); + assert_eq!(boolean("false true"), Ok((" true", false))); + assert_eq!(boolean("true,"), Ok((",", true))); + assert_eq!(boolean("false,"), Ok((",", false))); + assert!(boolean("truefalse").is_err()); + assert!(boolean("falsetrue").is_err()); + assert!(boolean("truea").is_err()); + assert!(boolean("falsea").is_err()); + assert!(boolean("a").is_err()); + assert!(boolean("-").is_err()); + assert!(boolean(" ").is_err()); + } +} diff --git a/src/parse/terms.rs b/src/parse/terms.rs index 4a1d18a..77b6fab 100644 --- a/src/parse/terms.rs +++ b/src/parse/terms.rs @@ -9,7 +9,7 @@ use nom:: sequence::{delimited, pair, preceded, terminated}, }; -use super::{Declarations, function_or_predicate_name, word_boundary, variable_name}; +use super::{Declarations, boolean, function_or_predicate_name, variable_name, word_boundary}; fn negative<'i>(i: &'i str, d: &Declarations) -> IResult<&'i str, crate::Term> { @@ -57,41 +57,6 @@ fn absolute_value<'i>(i: &'i str, d: &Declarations) -> IResult<&'i str, crate::T )(i) } -fn true_(i: &str) -> IResult<&str, crate::Term> -{ - map - ( - terminated - ( - tag("true"), - word_boundary, - ), - |_| crate::Term::true_(), - )(i) -} - -fn false_(i: &str) -> IResult<&str, crate::Term> -{ - map - ( - terminated - ( - tag("false"), - word_boundary, - ), - |_| crate::Term::false_(), - )(i) -} - -pub fn boolean(i: &str) -> IResult<&str, crate::Term> -{ - alt - (( - true_, - false_, - ))(i) -} - pub fn integer(i: &str) -> IResult<&str, crate::Term> { map @@ -321,7 +286,11 @@ fn term_precedence_0<'a>(i: &'a str, d: &Declarations) -> IResult<&'a str, crate { alt (( - boolean, + map + ( + boolean, + crate::Term::Boolean, + ), special_integer, integer, map @@ -824,24 +793,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_boolean() - { - assert_eq!(boolean("true"), Ok(("", Term::true_()))); - assert_eq!(boolean("false"), Ok(("", Term::false_()))); - assert_eq!(boolean("true false"), Ok((" false", Term::true_()))); - assert_eq!(boolean("false true"), Ok((" true", Term::false_()))); - assert_eq!(boolean("true,"), Ok((",", Term::true_()))); - assert_eq!(boolean("false,"), Ok((",", Term::false_()))); - assert!(boolean("truefalse").is_err()); - assert!(boolean("falsetrue").is_err()); - assert!(boolean("truea").is_err()); - assert!(boolean("falsea").is_err()); - assert!(boolean("a").is_err()); - assert!(boolean("-").is_err()); - assert!(boolean(" ").is_err()); - } - #[test] fn parse_integer() {