aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
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
parent7669641f3ea508a010ac79d951033be22bbce51b (diff)
Parse while loops
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedWhileNode.java14
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java21
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
5 files changed, 42 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java
index 7ccd4cbd..5fadfcaf 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java
@@ -2,6 +2,6 @@ package org.shedlang.compiler.ast.untyped;
import java.util.List;
-public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedAssignNode, UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedValNode, UntypedVarNode {
+public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedAssignNode, UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedValNode, UntypedVarNode, UntypedWhileNode {
UntypedFunctionStatementBehaviour behaviour();
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedWhileNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedWhileNode.java
new file mode 100644
index 00000000..29a5f0e8
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedWhileNode.java
@@ -0,0 +1,14 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+public record UntypedWhileNode(
+ UntypedExpressionNode condition,
+ UntypedBlockNode body,
+ Source source
+) implements UntypedFunctionStatementNode {
+ @Override
+ public UntypedFunctionStatementBehaviour behaviour() {
+ return UntypedFunctionStatementBehaviour.CONTINUE;
+ }
+}
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);
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 2e7e236e..485aa8fa 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -39,6 +39,9 @@ class DeclaredVariables {
case UntypedVarNode var ->
forVar(var, variables);
+
+ case UntypedWhileNode while_ ->
+ variables;
};
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 5a3ee7a7..3eff92bf 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -558,6 +558,9 @@ public class TypeChecker {
case UntypedVarNode var ->
typeCheckVar(var, context);
+
+ case UntypedWhileNode untypedWhileNode ->
+ throw new UnsupportedOperationException("TODO");
};
}