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
use super::{CharSeq, ParserResult, Parser, Succ, Fail, Error}; pub struct Many1<'a, T:'a> { parser: &'a (Parser<T>+'a) } pub fn many1<'a, T>(p: &'a (Parser<T> + 'a)) -> Many1<'a, T> { return Many1{parser: p}; } impl<'a, T> Parser<Vec<T>> for Many1<'a, T> { #[allow(unused_variables)] fn _parse(&self, cs: &mut CharSeq) -> ParserResult<Vec<T>> { let mut succ = true; let mut r = Vec::new(); while succ { match self.parser.parse(cs) { Succ(c) => r.push(c), Fail(m, l) => succ = false, Error(m, l) => return Error(m, l) } } if r.len() == 0 { return cs.fail("nothing"); } return Succ(r); } } #[cfg(test)] #[allow(unused_variables)] #[allow(unused_imports)] mod tests { use super::many1; use super::super::{CharSeq, ParserResult, Parser, Succ, Fail, Error}; #[test] fn test_many1_1() { let mut cs = CharSeq::new("aaabbbccc", "<mem>"); assert!(cs.pos == 0); let s = "a"; let m = many1(&s); match cs.accept(&m) { Succ(a) => assert!(a == vec!["a", "a", "a"]), _ => assert!(false, "bug") } assert!(cs.pos == 3); assert!(cs.view() == "bbbccc"); } #[test] fn test_many1_2() { let mut cs = CharSeq::new("aaabbbccc", "<mem>"); assert!(cs.pos == 0); let s = "x"; let m = many1(&s); match cs.accept(&m) { Fail(m, l) => (), Succ(a) => { let mut x = String::new(); for i in a.iter() { x.push_str(i.as_slice()); x.push(','); } assert!(false, format!("bug: succeded: {}", x)) }, Error(m, l) => assert!(false, "bug") } assert!(cs.pos == 0); assert!(cs.view() == "aaabbbccc"); } }