aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-08-19 10:42:44 +0100
committerMichael Williamson <mike@zwobble.org>2023-08-19 10:42:44 +0100
commitf2787ed9b40deabbbc9cbe2a6d38cafd1436fc6f (patch)
tree846fcf8ea7863c0d68e3aaacb0a1259066709ef3 /src/main/java/org/shedlang/compiler/parser
parent7669641f3ea508a010ac79d951033be22bbce51b (diff)
Parse while loops
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 9bf95612..a5a48756 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -315,6 +315,9 @@ public class Parser {
case KEYWORD_VAR ->
parseVar(tokens);
+ case KEYWORD_WHILE ->
+ parseWhile(tokens);
+
default ->
parseExpressionStatement(tokens);
};
@@ -601,4 +604,22 @@ public class Parser {
return new UntypedVarNode(target, expression, source);
}
+
+ private static UntypedFunctionStatementNode parseWhile(
+ TokenIterator<TokenType> tokens
+ ) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_WHILE);
+ tokens.skip(TokenType.SYMBOL_PAREN_OPEN);
+ var condition = parseTopLevelExpression(tokens);
+ tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
+
+ var body = parseBlock(tokens);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedWhileNode(condition, body, source);
+ }
}