2020-02-25 17:58:45 +01:00
|
|
|
use nom::
|
|
|
|
{
|
|
|
|
IResult,
|
|
|
|
bytes::complete::{take_while, take_while_m_n},
|
|
|
|
combinator::recognize,
|
2020-02-26 14:25:58 +01:00
|
|
|
sequence::{pair, terminated},
|
2020-02-25 17:58:45 +01:00
|
|
|
};
|
|
|
|
|
2020-02-26 14:25:58 +01:00
|
|
|
use super::word_boundary;
|
|
|
|
|
2020-02-25 17:58:45 +01:00
|
|
|
fn is_function_name_character_first(c: char) -> bool
|
|
|
|
{
|
|
|
|
c.is_alphabetic() && c.is_lowercase()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn is_function_name_character_body(c: char) -> bool
|
|
|
|
{
|
|
|
|
c.is_alphanumeric() || c == '_'
|
|
|
|
}
|
|
|
|
|
|
|
|
fn is_variable_name_character_first(c: char) -> bool
|
|
|
|
{
|
|
|
|
c.is_alphabetic() && c.is_uppercase()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn is_variable_name_character_body(c: char) -> bool
|
|
|
|
{
|
|
|
|
c.is_alphanumeric() || c == '_'
|
|
|
|
}
|
|
|
|
|
2020-02-28 15:35:47 +01:00
|
|
|
pub fn function_or_predicate_name(i: &str) -> IResult<&str, &str>
|
2020-02-25 17:58:45 +01:00
|
|
|
{
|
|
|
|
recognize
|
|
|
|
(
|
2020-02-26 14:25:58 +01:00
|
|
|
terminated
|
2020-02-25 17:58:45 +01:00
|
|
|
(
|
2020-02-26 14:25:58 +01:00
|
|
|
pair
|
|
|
|
(
|
|
|
|
take_while_m_n(1, 1, is_function_name_character_first),
|
|
|
|
take_while(is_function_name_character_body),
|
|
|
|
),
|
|
|
|
word_boundary,
|
2020-02-25 17:58:45 +01:00
|
|
|
)
|
|
|
|
)(i)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn variable_name(i: &str) -> IResult<&str, &str>
|
|
|
|
{
|
|
|
|
recognize
|
|
|
|
(
|
2020-02-26 14:25:58 +01:00
|
|
|
terminated
|
2020-02-25 17:58:45 +01:00
|
|
|
(
|
2020-02-26 14:25:58 +01:00
|
|
|
pair
|
|
|
|
(
|
|
|
|
take_while_m_n(1, 1, is_variable_name_character_first),
|
|
|
|
take_while(is_variable_name_character_body),
|
|
|
|
),
|
|
|
|
word_boundary,
|
2020-02-25 17:58:45 +01:00
|
|
|
)
|
|
|
|
)(i)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests
|
|
|
|
{
|
|
|
|
use crate::parse::*;
|
|
|
|
|
|
|
|
#[test]
|
2020-02-28 15:35:47 +01:00
|
|
|
fn parse_function_or_predicate_name()
|
2020-02-25 17:58:45 +01:00
|
|
|
{
|
2020-02-28 15:35:47 +01:00
|
|
|
assert_eq!(function_or_predicate_name("p rest"), Ok((" rest", "p")));
|
|
|
|
assert_eq!(function_or_predicate_name("f rest"), Ok((" rest", "f")));
|
|
|
|
assert_eq!(function_or_predicate_name("p, rest"), Ok((", rest", "p")));
|
|
|
|
assert_eq!(function_or_predicate_name("f, rest"), Ok((", rest", "f")));
|
|
|
|
assert_eq!(function_or_predicate_name("name_123 rest"), Ok((" rest", "name_123")));
|
|
|
|
assert!(function_or_predicate_name("0 rest").is_err());
|
|
|
|
assert!(function_or_predicate_name("123_asd rest").is_err());
|
|
|
|
assert!(function_or_predicate_name("P rest").is_err());
|
|
|
|
assert!(function_or_predicate_name("Predicate_123 rest").is_err());
|
|
|
|
assert!(function_or_predicate_name("_ rest").is_err());
|
|
|
|
assert!(function_or_predicate_name("_predicate_123 rest").is_err());
|
|
|
|
assert!(function_or_predicate_name(" ").is_err());
|
2020-02-25 17:58:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn parse_variable_name()
|
|
|
|
{
|
|
|
|
assert_eq!(variable_name("X Rest"), Ok((" Rest", "X")));
|
2020-02-26 14:25:58 +01:00
|
|
|
assert_eq!(variable_name("X, Rest"), Ok((", Rest", "X")));
|
2020-02-25 17:58:45 +01:00
|
|
|
assert_eq!(variable_name("Variable_123 Rest"), Ok((" Rest", "Variable_123")));
|
|
|
|
assert!(variable_name("0 Rest").is_err());
|
|
|
|
assert!(variable_name("123_Asd Rest").is_err());
|
|
|
|
assert!(variable_name("x Rest").is_err());
|
|
|
|
assert!(variable_name("variable_123 Rest").is_err());
|
|
|
|
assert!(variable_name("_ Rest").is_err());
|
|
|
|
assert!(variable_name("_variable_123 Rest").is_err());
|
|
|
|
assert!(variable_name(" ").is_err());
|
|
|
|
}
|
|
|
|
}
|