diff --git a/examples/main2.rs b/examples/main2.rs index 787e456cece35202baa429c15315da171a8e39a6..e513364198a156282aebc871dcdd7bce124c9441 100644 --- a/examples/main2.rs +++ b/examples/main2.rs @@ -73,7 +73,7 @@ fn math_eval(e: &Expr) -> i32 { Op::Sub => lv - rv, Op::Mul => lv * rv, Op::Div => lv / rv, - Op::Pow => lv ^ rv, + Op::Pow => lv.pow(rv as u32), } } } @@ -94,49 +94,6 @@ fn climb_op(op: &Op) -> (u8, Ass) { } } -fn test_clone(e: Expr) -> Expr { - Expr::BinOp(Box::new(e.clone()), Op::Add, Box::new(e)) -} - -// fn climb(e: Expr) -> Expr { -// println!("climb {:?}", &e); -// match e.clone() { -// Expr::Num(_) => e, -// Expr::BinOp(l, op, r) => { -// let (prec, ass) = climb_op(&op); - -// // lookahead -// let r_new = climb(*r); -// match r_new.clone() { -// Expr::Num(_) => Expr::BinOp(Box::new(*l), op, Box::new(r_new)), -// Expr::BinOp(r_l, r_op, r_r) => { -// let (r_prec, r_ass) = climb_op(&r_op); -// println!( -// "-- l: {:?}, r: {:?}, r_prec {}, prec {} -// ", -// r_l, r_r, prec, r_prec -// ); -// if r_prec -// < prec -// + match r_ass { -// Ass::Left => 1, -// Ass::Right => 0, -// } -// { -// // swap -// println!("swap"); -// let new_l = Expr::BinOp(Box::new(*l), op, Box::new(*r_l)); -// let new_top = Expr::BinOp(Box::new(new_l), r_op, Box::new(*r_r)); - -// new_top -// } else { -// Expr::BinOp(Box::new(*l), op, Box::new(r_new)) -// } -// } -// } -// } -// } -// } fn climb(e: Expr) -> Expr { println!("climb {:?}", &e); @@ -146,7 +103,7 @@ fn climb(e: Expr) -> Expr { let (prec, ass) = climb_op(&op); // lookahead - let e = match *r.clone() { + match *r.clone() { Expr::Num(_) => e, Expr::BinOp(r_l, r_op, r_r) => { let (r_prec, r_ass) = climb_op(&r_op); @@ -169,39 +126,56 @@ fn climb(e: Expr) -> Expr { climb(new_top) } else { - e + Expr::BinOp(l, op, Box::new(climb(*r))) } } - }; - - match e { - Expr::Num(_) => e, - Expr::BinOp(l, op, r) => Expr::BinOp(l, op, Box::new(climb(*r))) } } } } -fn test_eq(s:&str, v:i32) { - assert_eq!(math_eval(&climb(parse_expr(s).unwrap().1)), v); +fn test_eq(s: &str, v: i32) { + assert_eq!(math_eval(&climb(parse_expr(s).unwrap().1)), v); } #[test] fn climb1() { - test_eq("1-2+3", 1-2+3); + test_eq("1-2+3", 1 - 2 + 3); } #[test] fn climb2() { - test_eq("1*2+3", 1*2+3); + test_eq("1*2+3", 1 * 2 + 3); } #[test] fn climb3() { - test_eq("1*2+3*4-5", 1*2+3*4-5); + test_eq("1*2+3*4-5", 1 * 2 + 3 * 4 - 5); +} + +#[test] +fn climb4() { + test_eq("2^5", 2i32.pow(5)); } +#[test] +fn climb5() { + test_eq("2*3+4+5", 2*3+4+5); +} + +#[test] +fn climb6() { + test_eq("2*3-4*5-2", 2*3-4*5-2); +} + +#[test] +fn climb_err() { + test_eq("2 + 2 ^ 5 -3", 2 + 2i32.pow(5 - 3)); +} + + fn main() { + println!("{}", 2^5); let p = parse_expr("3*2+5").unwrap().1; println!("{:?}", &p); println!("math {}", math_expr(&p)); @@ -256,4 +230,17 @@ fn main() { println!("r {:?}", &r); println!("math r {}", math_expr(&r)); println!("eval r {} = {} ", math_eval(&r), ((1 - 2) - 3) - 4); + + + let i = "2^5-1"; + println!("\n{}", i); + let p = parse_expr(i).unwrap().1; + println!("{:?}", &p); + println!("math {}", math_expr(&p)); + println!("eval r {} = {} ", math_eval(&p), 1 - 2 - 3 - 4); + let r = climb(p); + println!("r {:?}", &r); + println!("math r {}", math_expr(&r)); + println!("eval r {} = {} ", math_eval(&r), ((1 - 2) - 3) - 4); + }