1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use crate::chars::*;
use crate::err::ECode;
use crate::iter::LCChars;
use crate::ptrait::{ParseRes, Parser};
use std::marker::PhantomData;
#[derive(Clone)]
pub struct Skip<CB: CharBool> {
cb: CB,
min: usize,
}
pub fn skip_while<CB: CharBool>(cb: CB, min: usize) -> Skip<CB> {
Skip { cb, min }
}
impl<CB: CharBool> Parser<()> for Skip<CB> {
fn parse<'a>(&self, i: &LCChars<'a>) -> ParseRes<'a, ()> {
let mut i = i.clone();
let mut i2 = i.clone();
let mut ndone = 0;
while let Some(c) = i.next() {
match self.cb.char_bool(c) {
true => {
i2 = i.clone();
ndone += 1;
}
false => {
return if ndone >= self.min {
Ok((i2, ()))
} else {
i.err_cr(ECode::UnexpectedChar(c))
}
}
}
}
if ndone < self.min {
return i.err_cr(ECode::EOF);
}
Ok((i, ()))
}
}
pub struct SkipRepeat<A: Parser<AV>, AV> {
a: A,
pha: PhantomData<AV>,
min: usize,
}
impl<A: Parser<AV>, AV> Parser<()> for SkipRepeat<A, AV> {
fn parse<'a>(&self, it: &LCChars<'a>) -> ParseRes<'a, ()> {
let mut done = 0;
let mut it = it.clone();
loop {
match self.a.parse(&it) {
Ok((ri, _)) => {
done += 1;
it = ri;
}
Err(e) => {
if done < self.min {
return Err(e);
}
return Ok((it, ()));
}
}
}
}
}
pub fn skip_repeat<A: Parser<AV>, AV>(a: A, min: usize) -> SkipRepeat<A, AV> {
SkipRepeat {
a,
min,
pha: PhantomData,
}
}