Just use repeated combinator
This commit is contained in:
parent
567ea60642
commit
0d4ea42678
@ -95,40 +95,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn zero_or_more<P, I, O>(parser: P) -> impl Parser<I, Vec<O>, I>
|
|
||||||
where
|
|
||||||
P: Parser<I, O, I>,
|
|
||||||
I: Copy,
|
|
||||||
{
|
|
||||||
move |mut input| {
|
|
||||||
let mut results = Vec::new();
|
|
||||||
|
|
||||||
while let Ok((item, rest)) = parser.parse(input) {
|
|
||||||
results.push(item);
|
|
||||||
input = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok((results, input))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn one_or_more<P, I, O>(parser: P) -> impl Parser<I, Vec<O>, I>
|
|
||||||
where
|
|
||||||
P: Parser<I, O, I> + 'static,
|
|
||||||
I: Copy + 'static,
|
|
||||||
O: 'static,
|
|
||||||
{
|
|
||||||
let parser = std::rc::Rc::new(parser);
|
|
||||||
parser
|
|
||||||
.clone()
|
|
||||||
.then(zero_or_more(parser))
|
|
||||||
.map(|(first, rest)| {
|
|
||||||
let mut output = vec![first];
|
|
||||||
output.extend(rest.into_iter());
|
|
||||||
output
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -12,7 +12,7 @@ pub use parser::{ParseResult, Parser};
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::choice::choice;
|
use crate::choice::choice;
|
||||||
use crate::combinators::{one_or_more, zero_or_more};
|
use crate::combinators::repeated;
|
||||||
use crate::primitives::{any_char, literal, literal_char, one_of, pred};
|
use crate::primitives::{any_char, literal, literal_char, one_of, pred};
|
||||||
use crate::sequence::seq;
|
use crate::sequence::seq;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@ -54,8 +54,8 @@ mod tests {
|
|||||||
|
|
||||||
let json_number_inner = choice((
|
let json_number_inner = choice((
|
||||||
seq((
|
seq((
|
||||||
one_or_more(digit()),
|
repeated(digit()).at_least(1),
|
||||||
literal(".").then(zero_or_more(digit())).optional(),
|
literal(".").then(repeated(digit())).optional(),
|
||||||
))
|
))
|
||||||
.map(|(mut digits, maybe_more)| {
|
.map(|(mut digits, maybe_more)| {
|
||||||
if let Some((point, more)) = maybe_more {
|
if let Some((point, more)) = maybe_more {
|
||||||
@ -64,7 +64,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
digits.into_iter().collect::<String>()
|
digits.into_iter().collect::<String>()
|
||||||
}),
|
}),
|
||||||
seq((literal("."), one_or_more(digit()))).map(|(_point, digits)| {
|
seq((literal("."), repeated(digit()).at_least(1))).map(|(_point, digits)| {
|
||||||
let mut d = vec!["."];
|
let mut d = vec!["."];
|
||||||
d.extend(digits.into_iter());
|
d.extend(digits.into_iter());
|
||||||
d.into_iter().collect::<String>()
|
d.into_iter().collect::<String>()
|
||||||
|
@ -110,7 +110,7 @@ where
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::combinators::zero_or_more;
|
use crate::combinators::repeated;
|
||||||
use crate::primitives::{identifier, literal};
|
use crate::primitives::{identifier, literal};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -128,16 +128,16 @@ mod test {
|
|||||||
fn test_seq() {
|
fn test_seq() {
|
||||||
let p = seq((
|
let p = seq((
|
||||||
literal("bong").to(10),
|
literal("bong").to(10),
|
||||||
zero_or_more(literal(" ")).to(()),
|
repeated(literal(" ")).to(()),
|
||||||
literal("hits").to(20),
|
literal("hits").to(20),
|
||||||
));
|
));
|
||||||
assert_eq!(p.parse("bong hits").unwrap(), ((10, (), 20), ""));
|
assert_eq!(p.parse("bong hits").unwrap(), ((10, (), 20), ""));
|
||||||
|
|
||||||
let p = seq((
|
let p = seq((
|
||||||
literal("alpha").to(10),
|
literal("alpha").to(10),
|
||||||
zero_or_more(literal(" ")).to(()),
|
repeated(literal(" ")).to(()),
|
||||||
zero_or_more(literal("-")).to(()),
|
repeated(literal("-")).to(()),
|
||||||
zero_or_more(literal(" ")),
|
repeated(literal(" ")),
|
||||||
literal("beta"),
|
literal("beta"),
|
||||||
));
|
));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
Loading…
Reference in New Issue
Block a user