foliage-rs/src/parse/names.rs

117 lines
2.8 KiB
Rust

use nom::
{
IResult,
bytes::complete::{take_while, take_while_m_n},
combinator::recognize,
sequence::{pair, terminated},
};
use super::word_boundary;
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 == '_'
}
pub fn function_name(i: &str) -> IResult<&str, &str>
{
recognize
(
terminated
(
pair
(
take_while_m_n(1, 1, is_function_name_character_first),
take_while(is_function_name_character_body),
),
word_boundary,
)
)(i)
}
pub fn predicate_name(i: &str) -> IResult<&str, &str>
{
function_name(i)
}
pub fn variable_name(i: &str) -> IResult<&str, &str>
{
recognize
(
terminated
(
pair
(
take_while_m_n(1, 1, is_variable_name_character_first),
take_while(is_variable_name_character_body),
),
word_boundary,
)
)(i)
}
#[cfg(test)]
mod tests
{
use crate::parse::*;
#[test]
fn parse_function_name()
{
assert_eq!(function_name("f rest"), Ok((" rest", "f")));
assert_eq!(function_name("function_123 rest"), Ok((" rest", "function_123")));
assert!(function_name("0 rest").is_err());
assert!(function_name("123_asd rest").is_err());
assert!(function_name("F rest").is_err());
assert!(function_name("Function_123 rest").is_err());
assert!(function_name("_ rest").is_err());
assert!(function_name("_function_123 rest").is_err());
assert!(function_name(" ").is_err());
}
#[test]
fn parse_predicate_name()
{
assert_eq!(predicate_name("p rest"), Ok((" rest", "p")));
assert_eq!(predicate_name("p, rest"), Ok((", rest", "p")));
assert_eq!(predicate_name("predicate_123 rest"), Ok((" rest", "predicate_123")));
assert!(predicate_name("0 rest").is_err());
assert!(predicate_name("123_asd rest").is_err());
assert!(predicate_name("P rest").is_err());
assert!(predicate_name("Predicate_123 rest").is_err());
assert!(predicate_name("_ rest").is_err());
assert!(predicate_name("_predicate_123 rest").is_err());
assert!(predicate_name(" ").is_err());
}
#[test]
fn parse_variable_name()
{
assert_eq!(variable_name("X Rest"), Ok((" Rest", "X")));
assert_eq!(variable_name("X, Rest"), Ok((", Rest", "X")));
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());
}
}