From 16120bc80e13a557a6065f08c1da24453920241a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 3 Jul 2023 11:56:38 +0100 Subject: Parse val statements --- .../ast/untyped/UntypedFunctionStatementNode.java | 2 +- .../compiler/ast/untyped/UntypedTargetNode.java | 7 ++++ .../compiler/ast/untyped/UntypedValNode.java | 10 ++++++ .../java/org/shedlang/compiler/parser/Parser.java | 38 +++++++++++++++++++++- .../shedlang/compiler/typechecker/TypeChecker.java | 3 ++ 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java (limited to 'src/main/java') 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 64704e10..45d71235 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java @@ -1,4 +1,4 @@ package org.shedlang.compiler.ast.untyped; -public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedExpressionStatementNode { +public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedExpressionStatementNode, UntypedValNode { } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java new file mode 100644 index 00000000..514b794a --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java @@ -0,0 +1,7 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +public sealed interface UntypedTargetNode extends UntypedNode { + record Variable(String name, Source source) implements UntypedTargetNode {} +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java new file mode 100644 index 00000000..96bbcb42 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +public record UntypedValNode( + UntypedTargetNode target, + UntypedExpressionNode expression, + Source source +) implements UntypedFunctionStatementNode { +} diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 8b180044..14d9fc6c 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -124,7 +124,13 @@ public class Parser { } static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator tokens) { - return parseExpressionStatement(tokens); + return switch (tokens.peek().tokenType()) { + case KEYWORD_VAL -> + parseVal(tokens); + + default -> + parseExpressionStatement(tokens); + }; } private static List parseMany( @@ -269,4 +275,34 @@ public class Parser { return new UntypedReferenceNode(name, source); } + + private static UntypedTargetNode parseTarget(TokenIterator tokens) { + var start = tokens.position(); + + var name = tokens.nextValue(TokenType.IDENTIFIER); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedTargetNode.Variable(name, source); + } + + private static UntypedFunctionStatementNode parseVal(TokenIterator tokens) { + var start = tokens.position(); + + tokens.skip(TokenType.KEYWORD_VAL); + + var target = parseTarget(tokens); + + tokens.skip(TokenType.SYMBOL_EQUALS); + + var expression = parseTopLevelExpression(tokens); + + tokens.skip(TokenType.SYMBOL_SEMICOLON); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedValNode(target, expression, source); + } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 3b128801..c5cb4470 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -259,6 +259,9 @@ public class TypeChecker { return switch (untyped) { case UntypedExpressionStatementNode expressionStatement -> typeCheckExpressionStatement(expressionStatement, context); + + case UntypedValNode val -> + throw new UnsupportedOperationException("TODO"); }; } -- cgit v1.2.3