aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-03 11:56:38 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-03 11:56:38 +0100
commit16120bc80e13a557a6065f08c1da24453920241a (patch)
tree1054377b7a50784bd8c00fd19fc0b391d9887078 /src/main/java
parentac10379092046d3dfa03e353ae8125a517813961 (diff)
Parse val statements
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/UntypedTargetNode.java7
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedValNode.java10
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java38
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
5 files changed, 58 insertions, 2 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 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<TokenType> tokens) {
- return parseExpressionStatement(tokens);
+ return switch (tokens.peek().tokenType()) {
+ case KEYWORD_VAL ->
+ parseVal(tokens);
+
+ default ->
+ parseExpressionStatement(tokens);
+ };
}
private static <T> List<T> parseMany(
@@ -269,4 +275,34 @@ public class Parser {
return new UntypedReferenceNode(name, source);
}
+
+ private static UntypedTargetNode parseTarget(TokenIterator<TokenType> 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<TokenType> 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");
};
}