From 7ad736bca81c41acaa3c27f3c76538b17f556850 Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Thu, 5 Sep 2019 16:25:15 +0200 Subject: [PATCH] with test --- src/main.rs | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index fb6230e..5a8e287 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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")); } -- GitLab