Skip to content

Instantly share code, notes, and snippets.

@chemist
Created April 8, 2015 14:20
Show Gist options
  • Save chemist/ded03c1aa0cbb9d65209 to your computer and use it in GitHub Desktop.
Save chemist/ded03c1aa0cbb9d65209 to your computer and use it in GitHub Desktop.
parser battle
extern crate parser_combinators as pc;
use pc::*;
use pc::primitives::{State, Stream};
fn main() {
match parser(parse_passport).parse("a123,456") {
Ok((r,l)) => println!("{} {} {}", r.label, r.body, l),
Err(e) => println!("{}", e)
}
}
struct Passport {
label : i8,
body : i32,
}
fn parse_passport<I>(input: State<I>) -> ParseResult<Passport, I> where I: Stream<Item=char> {
let mut label = digit().map(|i : char| (i as i8) - ('0' as i8));
let mut fst = many1(digit()).map(|string : String| string.parse::<i32>().unwrap());
let (i,input) = match label.parse_state(input) {
Ok((x,n)) => (x,n.into_inner()),
Err(e) => return Err(e)
};
let (f,input) = match fst.parse_state(input) {
Ok((x,n)) => (x,n.into_inner()),
Err(e) => return Err(e)
};
let (_,input) = match satisfy(|c| c == ',').parse_state(input) {
Ok((x,n)) => (x,n.into_inner()),
Err(e) => return Err(e)
};
let (s,input) = match fst.parse_state(input) {
Ok((x,n)) => (x,n),
Err(e) => return Err(e)
};
let p = Passport { label : i, body : f * 1000000 + s };
Ok((p, input))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment