136 lines
3.3 KiB
Rust
136 lines
3.3 KiB
Rust
use crate::parser::*;
|
|
use nom::branch::*;
|
|
use nom::IResult;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#[derive(Debug)]
|
|
pub struct Operator<'a> {
|
|
pub nodes: (Symbol<'a>,),
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
pub fn unary_operator(s: &str) -> IResult<&str, Operator> {
|
|
let (s, a) = alt((
|
|
symbol("+"),
|
|
symbol("-"),
|
|
symbol("!"),
|
|
symbol("&"),
|
|
symbol("|"),
|
|
symbol("~&"),
|
|
symbol("~|"),
|
|
symbol("~^"),
|
|
symbol("^~"),
|
|
symbol("^"),
|
|
symbol("~"),
|
|
))(s)?;
|
|
Ok((s, Operator { nodes: (a,) }))
|
|
}
|
|
|
|
pub fn binary_operator(s: &str) -> IResult<&str, Operator> {
|
|
let (s, a) = alt((
|
|
alt((
|
|
symbol("+"),
|
|
symbol("-"),
|
|
symbol("**"),
|
|
symbol("*"),
|
|
symbol("/"),
|
|
symbol("%"),
|
|
symbol("==="),
|
|
symbol("==?"),
|
|
symbol("=="),
|
|
symbol("!=="),
|
|
symbol("!=?"),
|
|
symbol("!="),
|
|
symbol("&&"),
|
|
symbol("||"),
|
|
)),
|
|
alt((
|
|
symbol("&"),
|
|
symbol("|"),
|
|
symbol("^~"),
|
|
symbol("^"),
|
|
symbol("~^"),
|
|
symbol(">>>"),
|
|
symbol(">>"),
|
|
symbol("<<<"),
|
|
symbol("<<"),
|
|
symbol("->"),
|
|
symbol("<->"),
|
|
symbol("<="),
|
|
symbol("<"),
|
|
symbol(">="),
|
|
symbol(">"),
|
|
)),
|
|
))(s)?;
|
|
Ok((s, Operator { nodes: (a,) }))
|
|
}
|
|
|
|
pub fn inc_or_dec_operator(s: &str) -> IResult<&str, Operator> {
|
|
let (s, a) = alt((symbol("++"), symbol("--")))(s)?;
|
|
Ok((s, Operator { nodes: (a,) }))
|
|
}
|
|
|
|
pub fn unary_module_path_operator(s: &str) -> IResult<&str, Operator> {
|
|
let (s, a) = alt((
|
|
symbol("!"),
|
|
symbol("&"),
|
|
symbol("|"),
|
|
symbol("~&"),
|
|
symbol("~|"),
|
|
symbol("~^"),
|
|
symbol("^~"),
|
|
symbol("^"),
|
|
symbol("~"),
|
|
))(s)?;
|
|
Ok((s, Operator { nodes: (a,) }))
|
|
}
|
|
|
|
pub fn binary_module_path_operator(s: &str) -> IResult<&str, Operator> {
|
|
let (s, a) = alt((
|
|
symbol("=="),
|
|
symbol("!="),
|
|
symbol("&&"),
|
|
symbol("||"),
|
|
symbol("&"),
|
|
symbol("|"),
|
|
symbol("^~"),
|
|
symbol("^"),
|
|
symbol("~^"),
|
|
))(s)?;
|
|
Ok((s, Operator { nodes: (a,) }))
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use nom::combinator::*;
|
|
|
|
#[test]
|
|
fn test() {
|
|
assert_eq!(
|
|
format!("{:?}", all_consuming(unary_operator)("~")),
|
|
"Ok((\"\", Operator { raw: \"~\" }))"
|
|
);
|
|
assert_eq!(
|
|
format!("{:?}", all_consuming(binary_operator)(">>>")),
|
|
"Ok((\"\", Operator { raw: \">>>\" }))"
|
|
);
|
|
assert_eq!(
|
|
format!("{:?}", all_consuming(inc_or_dec_operator)("++")),
|
|
"Ok((\"\", Operator { raw: \"++\" }))"
|
|
);
|
|
assert_eq!(
|
|
format!("{:?}", all_consuming(unary_module_path_operator)("^~")),
|
|
"Ok((\"\", Operator { raw: \"^~\" }))"
|
|
);
|
|
assert_eq!(
|
|
format!("{:?}", all_consuming(binary_module_path_operator)("||")),
|
|
"Ok((\"\", Operator { raw: \"||\" }))"
|
|
);
|
|
}
|
|
}
|