Move boolean parser to separate module

This commit is contained in:
Patrick Lühne 2020-03-27 03:00:09 +01:00
parent a1bbae9201
commit 29ea4578e4
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
4 changed files with 83 additions and 111 deletions

View File

@ -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;

View File

@ -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()
{

69
src/parse/literals.rs Normal file
View File

@ -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());
}
}

View File

@ -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()
{