Skip to content
Snippets Groups Projects
Commit 7ad736bc authored by Per Lindgren's avatar Per Lindgren
Browse files

with test

parent d29db8fb
Branches
No related tags found
No related merge requests found
......@@ -6,8 +6,7 @@ use nom::{
bytes::complete::tag,
character::complete::{digit1, multispace0},
combinator::map,
error::{VerboseError, VerboseErrorKind},
map_res,
error::{context, VerboseError, VerboseErrorKind},
sequence::{preceded, tuple},
IResult,
};
......@@ -24,29 +23,48 @@ pub enum Expr {
}
pub fn parse_i32(i: &str) -> IResult<&str, Expr, VerboseError<&str>> {
map_res(digit1, |digit_str: &str| match digit_str.parse::<i32>() {
Err(e) => Err(VerboseError {
errors: vec![(digit_str, VerboseErrorKind::Context("not a 32-bit integer"))],
}),
Ok(x) => Ok(Expr::Num(x)),
map_res::<_, _, _, _, VerboseError<&str>, _, _>(digit1, |digit_str: &str| {
match digit_str.parse::<i32>() {
// Err(e) => panic!("e {:?}", e),
Err(_) => Err(VerboseError {
errors: vec![(digit_str, VerboseErrorKind::Context("not a 32-bit integer"))],
}),
Ok(x) => Ok(Expr::Num(x)),
}
})(i)
}
fn parse_expr(input: &str) -> IResult<&str, Expr, VerboseError<&str>> {
preceded(
multispace0,
alt((
map(
tuple((parse_i32, preceded(multispace0, tag("+")), parse_expr)),
|(l, _, r)| Expr::BinOp(Box::new(l), Op::Add, Box::new(r)),
),
parse_i32,
)),
context(
"parse_expr",
preceded(
multispace0,
alt((
map(
tuple((parse_i32, preceded(multispace0, tag("+")), parse_expr)),
|(l, _, r)| Expr::BinOp(Box::new(l), Op::Add, Box::new(r)),
),
parse_i32,
)),
),
)(input)
}
// cargo test
#[test]
fn test_parse_i32_1() {
let res = parse_expr("2");
assert!(res == Ok(("", Expr::Num(1))))
}
#[test]
fn test_parse_i32_2() {
let _ = parse_expr("1a").is_ok();
}
fn main() {
println!("{:?}", parse_expr("1"));
println!("{:?}", parse_expr("1+1a"));
println!("{:?}", parse_expr("1+2 + 3"));
println!("{:?}", parse_expr(" 1+ 1a"));
println!("{:?}", parse_expr("11111111111111111111111111"));
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment