Added while loop parser and (currently ignored) tests.
diff --git a/src/expr.rs b/src/expr.rs
index 64e864d..c2310ce 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -357,7 +357,8 @@
|
expr_if
// TODO: IfLet
- // TODO: While
+ |
+ expr_while
// TODO: WhileLet
// TODO: ForLoop
// TODO: Loop
@@ -561,6 +562,18 @@
))
));
+ named!(expr_while -> Expr, do_parse!(
+ lt: option!(terminated!(lifetime, punct!(":"))) >>
+ punct!("while") >>
+ cond: expr >>
+ while_block: block >>
+ (Expr::While(
+ Box::new(cond),
+ Box::new(while_block),
+ lt.map(|lt| lt.ident),
+ ))
+ ));
+
named!(expr_block -> Expr, map!(block, |b| Expr::Block(Box::new(b))));
named!(block -> Block, do_parse!(
diff --git a/tests/test_expr.rs b/tests/test_expr.rs
index 587102f..b38da8e 100644
--- a/tests/test_expr.rs
+++ b/tests/test_expr.rs
@@ -41,3 +41,35 @@
assert_eq!(expected, parse_expr(raw).unwrap());
}
+
+#[test]
+// Ignore test until bool parsing is available
+#[ignore]
+fn test_unnamed_while() {
+ let block = match parse_expr("{ ( 1, 3, 8 ) }").unwrap() {
+ Expr::Block(b) => b,
+ _ => panic!("Could not run test_unnamed_while: error in block parse."),
+ };
+
+ let raw = "while true {(1, 3, 8 )}";
+
+ let expected = Expr::While(Box::new(Expr::Lit(Lit::Bool(true))), block, None);
+
+ assert_eq!(expected, parse_expr(raw).unwrap());
+}
+
+#[test]
+// Ignore test until bool parsing is available
+#[ignore]
+fn test_named_while() {
+ let block = match parse_expr("{ ( 1, 5, 9, 11) }").unwrap() {
+ Expr::Block(b) => b,
+ _ => panic!("Could not run named_while: error in block parse."),
+ };
+
+ let raw = "' test : while true {(1, 5, 9, 11)}";
+
+ let expected = Expr::While(Box::new(Expr::Lit(Lit::Bool(true))), block, Some("'test".into()));
+
+ assert_eq!(expected, parse_expr(raw).unwrap());
+}