81 lines
2.0 KiB
Rust
81 lines
2.0 KiB
Rust
use crate::parser::*;
|
|
use nom::bytes::complete::*;
|
|
use nom::character::complete::*;
|
|
use nom::combinator::*;
|
|
use nom::IResult;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#[derive(Debug)]
|
|
pub struct Symbol<'a> {
|
|
pub nodes: (&'a str,),
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
pub fn ws<'a, O, F>(f: F) -> impl Fn(&'a str) -> IResult<&'a str, O>
|
|
where
|
|
F: Fn(&'a str) -> IResult<&'a str, O>,
|
|
{
|
|
move |s: &'a str| {
|
|
let (s, _) = space0(s)?;
|
|
let (s, x) = f(s)?;
|
|
let (s, _) = space0(s)?;
|
|
Ok((s, x))
|
|
}
|
|
}
|
|
|
|
pub fn symbol<'a>(t: &'a str) -> impl Fn(&'a str) -> IResult<&'a str, Symbol<'a>> {
|
|
move |s: &'a str| ws(map(tag(t.clone()), |x| Symbol { nodes: (x,) }))(s)
|
|
}
|
|
|
|
pub fn paren<'a, O, F>(f: F) -> impl Fn(&'a str) -> IResult<&'a str, O>
|
|
where
|
|
F: Fn(&'a str) -> IResult<&'a str, O>,
|
|
{
|
|
move |s: &'a str| {
|
|
let (s, _) = symbol("(")(s)?;
|
|
let (s, x) = f(s)?;
|
|
let (s, _) = symbol(")")(s)?;
|
|
Ok((s, x))
|
|
}
|
|
}
|
|
|
|
pub fn bracket<'a, O, F>(f: F) -> impl Fn(&'a str) -> IResult<&'a str, O>
|
|
where
|
|
F: Fn(&'a str) -> IResult<&'a str, O>,
|
|
{
|
|
move |s: &'a str| {
|
|
let (s, _) = symbol("[")(s)?;
|
|
let (s, x) = f(s)?;
|
|
let (s, _) = symbol("]")(s)?;
|
|
Ok((s, x))
|
|
}
|
|
}
|
|
|
|
pub fn brace<'a, O, F>(f: F) -> impl Fn(&'a str) -> IResult<&'a str, O>
|
|
where
|
|
F: Fn(&'a str) -> IResult<&'a str, O>,
|
|
{
|
|
move |s: &'a str| {
|
|
let (s, _) = symbol("{")(s)?;
|
|
let (s, x) = f(s)?;
|
|
let (s, _) = symbol("}")(s)?;
|
|
Ok((s, x))
|
|
}
|
|
}
|
|
|
|
pub fn apostrophe_brace<'a, O, F>(f: F) -> impl Fn(&'a str) -> IResult<&'a str, O>
|
|
where
|
|
F: Fn(&'a str) -> IResult<&'a str, O>,
|
|
{
|
|
move |s: &'a str| {
|
|
let (s, _) = symbol("'{")(s)?;
|
|
let (s, x) = f(s)?;
|
|
let (s, _) = symbol("}")(s)?;
|
|
Ok((s, x))
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|