topdown-rs 0.0.1

A top-down parsing library
use super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};

pub struct Try<'a, T> {
    parser: &'a (Parser<T> + 'a)
}

pub fn try<'a, T>(p: &'a(Parser<T>+'a)) -> Try<'a, T> {
    return Try{parser:p};
}

impl<'a, T> Parser<T> for Try<'a, T> {
    #[allow(unused_variables)]
    fn _parse(&self, cs: &mut CharSeq) -> ParserResult<T> {
        let p = cs.pos;
        match cs.accept(self.parser) {
            Succ(c) => return Succ(c),
            Fail(m, l) => {
                cs.pos = p;
                return Fail(m, l)
            },
            Error(m, l) => return Error(m, l)
        }
    }
}

#[cfg(test)]
#[allow(unused_variables)]
#[allow(unused_imports)]
mod tests {
    use super::try;
    use super::super::{CharSeq, wrap, ParserResult, Parser, Succ, Fail, Error};

    fn p(cs : &mut CharSeq) -> ParserResult<String> {
        cs.accept(&"abc");
        cs.accept(&"def")
    }

    #[test]
    fn test_try() {
        let mut cs = CharSeq::new("abcxyz", "");
        let f = wrap(p);
        let t = try(&f);
        cs.accept(&t);
        assert_eq!(0, cs.pos);
        cs.accept(&f);
        assert_eq!(3, cs.pos);
    }
}