aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-28 21:42:59 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-28 21:42:59 +0100
commit30fd20f6afb6c3ad364497722387d17767e43ffd (patch)
treefb7a6e65caa8c5ef9c8aad628c87d0e426269023 /src/main/java
parent4ca37b72c38c83cedbe1dd4719f999b3850da0df (diff)
Parse assign node
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedAssignNode.java14
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java22
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
4 files changed, 40 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedAssignNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedAssignNode.java
new file mode 100644
index 00000000..9e6827f8
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedAssignNode.java
@@ -0,0 +1,14 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+public record UntypedAssignNode(
+ UntypedTargetNode target,
+ UntypedExpressionNode expression,
+ Source source
+) implements UntypedFunctionStatementNode {
+ @Override
+ public UntypedFunctionStatementBehaviour behaviour() {
+ return UntypedFunctionStatementBehaviour.CONTINUE;
+ }
+}
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 807751c8..7ccd4cbd 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 UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedValNode, UntypedVarNode {
+public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedAssignNode, UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedValNode, UntypedVarNode {
UntypedFunctionStatementBehaviour behaviour();
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 03d217cd..8ffed6c5 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -104,6 +104,25 @@ public class Parser {
return new UntypedArgsNode(positional, named, argsSource);
}
+ private static UntypedAssignNode parseAssign(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_ASSIGN);
+
+ var target = parseTarget(tokens);
+
+ tokens.skip(TokenType.SYMBOL_COLON_EQUALS);
+
+ var expression = parseTopLevelExpression(tokens);
+
+ tokens.skip(TokenType.SYMBOL_SEMICOLON);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedAssignNode(target, expression, source);
+ }
+
private static UntypedBlockNode parseBlock(TokenIterator<TokenType> tokens) {
var start = tokens.position();
@@ -270,6 +289,9 @@ public class Parser {
static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator<TokenType> tokens) {
return switch (tokens.peek().tokenType()) {
+ case KEYWORD_ASSIGN ->
+ parseAssign(tokens);
+
case KEYWORD_RETURN ->
parseFunctionReturn(tokens);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index a238fd21..e0be25eb 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -525,6 +525,9 @@ public class TypeChecker {
TypeCheckerContext context
) {
return switch (untyped) {
+ case UntypedAssignNode assign ->
+ throw new UnsupportedOperationException();
+
case UntypedBlockReturnNode blockReturn ->
typeCheckBlockReturn(blockReturn, context);