summaryrefslogtreecommitdiff
path: root/src/parse/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/mod.rs')
-rw-r--r--src/parse/mod.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs
index 8d6958cf..d4cf90c7 100644
--- a/src/parse/mod.rs
+++ b/src/parse/mod.rs
@@ -71,7 +71,7 @@ fn node(p: &mut Parser, at_start: &mut bool) -> Option<Node> {
Token::UnicodeEscape(t) => Node::Text(unicode_escape(p, t)),
// Hashtag + keyword / identifier.
- Token::Ident(_) | Token::Let | Token::If | Token::For => {
+ Token::Ident(_) | Token::Let | Token::If | Token::While | Token::For => {
*at_start = false;
let stmt = token == Token::Let;
let group = if stmt { Group::Stmt } else { Group::Expr };
@@ -191,6 +191,7 @@ fn primary(p: &mut Parser) -> Option<Expr> {
// Keywords.
Some(Token::Let) => expr_let(p),
Some(Token::If) => expr_if(p),
+ Some(Token::While) => expr_while(p),
Some(Token::For) => expr_for(p),
// Structures.
@@ -382,6 +383,25 @@ fn expr_if(p: &mut Parser) -> Option<Expr> {
expr_if
}
+/// Parse a while expresion.
+fn expr_while(p: &mut Parser) -> Option<Expr> {
+ let start = p.start();
+ p.assert(Token::While);
+
+ let mut expr_while = None;
+ if let Some(condition) = expr(p) {
+ if let Some(body) = body(p) {
+ expr_while = Some(Expr::While(ExprWhile {
+ span: p.span(start),
+ condition: Box::new(condition),
+ body: Box::new(body),
+ }));
+ }
+ }
+
+ expr_while
+}
+
/// Parse a for expression.
fn expr_for(p: &mut Parser) -> Option<Expr> {
let start = p.start();