use super::{CharSeq, ParserResult, Parser, Succ};
use regex::Regex;
pub struct Re {
pattern: Regex
}
#[allow(unused_variables)]
pub fn re(p: &str) -> Re {
match Regex::new(p) {
Ok(r) => return Re{pattern: r},
Err(e) => panic!("{}", p)
}
}
impl Parser<String> for Re {
fn _parse(&self, cs: &mut CharSeq) -> ParserResult<String> {
match self.pattern.find(cs.view()) {
Some((a, b)) => {
if a != 0 {
return cs.fail(self.pattern.as_str());
}
let r = cs.view()[..b].to_string();
cs.pos += b;
return Succ(r);
},
None => return cs.fail(self.pattern.as_str())
}
}
}
#[cfg(test)]
#[allow(unused_variables)]
#[allow(unused_imports)]
mod tests {
use super::re;
use super::super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
#[test]
fn test_re1() {
let mut cs = CharSeq::new("int x = 10;", "");
let ident = re("[a-zA-Z_][a-zA-Z0-9_]*");
let num = re("[1-9][0-9]*");
let r = cs.accept(&ident).and_then(|t|
cs.accept(&" ").and_then(|a|
cs.accept(&ident).and_then(|v|
cs.accept(&" = ").and_then(|a|
cs.accept(&num).map(|n| {
return vec!(t.clone(), v.clone(), n.clone());
}))))
);
match r {
Succ(c) => {
assert_eq!(c[0].as_slice(), "int");
assert_eq!(c[1].as_slice(), "x");
assert_eq!(c[2].as_slice(), "10");
},
_ => assert!(false, "bug")
}
}
}