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
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") } } }