From 30fd20f6afb6c3ad364497722387d17767e43ffd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 28 Jul 2023 21:42:59 +0100 Subject: Parse assign node --- .../compiler/ast/untyped/UntypedAssignNode.java | 14 ++++++++++++++ .../ast/untyped/UntypedFunctionStatementNode.java | 2 +- .../java/org/shedlang/compiler/parser/Parser.java | 22 ++++++++++++++++++++++ .../shedlang/compiler/typechecker/TypeChecker.java | 3 +++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedAssignNode.java (limited to 'src/main/java') 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 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 tokens) { var start = tokens.position(); @@ -270,6 +289,9 @@ public class Parser { static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator 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); -- cgit v1.2.3