topdown/
many.rs

1use super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
2
3pub struct Many<'a, T:'a> {
4    parser: &'a (Parser<T>+'a)
5}
6
7pub fn many<'a, T>(p: &'a (Parser<T> + 'a)) -> Many<'a, T> {
8    return Many{parser: p};
9}
10
11impl<'a, T> Parser<Vec<T>> for Many<'a, T> {
12    #[allow(unused_variables)]
13    fn _parse(&self, cs: &mut CharSeq) -> ParserResult<Vec<T>> {
14        let mut succ = true;
15        let mut r = Vec::new();
16        while succ {
17            match self.parser.parse(cs) {
18                Succ(c) => r.push(c),
19                Fail(m, l) => succ = false,
20                Error(m, l) => return Error(m, l)
21            }
22        }
23        return Succ(r);
24    }
25}
26
27
28#[cfg(test)]
29#[allow(unused_variables)]
30#[allow(unused_imports)]
31mod tests {
32    use super::many;
33    use super::super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
34
35    #[test]
36    fn test_many1() {
37        let mut cs = CharSeq::new("aaabbbccc", "<mem>");
38        assert!(cs.pos == 0);
39        let s = "a";
40        let m = many(&s);
41        match cs.accept(&m) {
42            Succ(a) => assert!(a == vec!["a", "a", "a"]),
43            _ => assert!(false, "bug")
44        }
45        assert!(cs.pos == 3);
46        assert!(cs.view() == "bbbccc");
47    }
48
49    #[test]
50    fn test_many2() {
51        let mut cs = CharSeq::new("aaabbbccc", "<mem>");
52        assert!(cs.pos == 0);
53        let s = "x";
54        let m = many(&s);
55        match cs.accept(&m) {
56            Succ(a) => assert!(a.len() == 0),
57            _ => assert!(false, "bug")
58        }
59        assert!(cs.pos == 0);
60        assert!(cs.view() == "aaabbbccc");
61    }
62}