aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-27 20:22:34 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-27 20:22:34 +0100
commita0074f328bfabc0c28d7e5b1202761daaa265fc8 (patch)
tree28336e56dbf2341e6630d5ea27f7a9348b46ccde /src/main/java/org
parent71e8f7645a022dbe913cb0e5ea3a1ab5e9b33a0f (diff)
Parse struct without fields
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java12
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java10
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java22
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java8
6 files changed, 56 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java
index 90e7142f..16eafcf9 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.ast.untyped;
-public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedAssignNode, UntypedFunctionDefinitionNode {
+public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedAssignNode, UntypedFunctionDefinitionNode, UntypedStructDefinitionNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
new file mode 100644
index 00000000..49490b8d
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
@@ -0,0 +1,12 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record UntypedStructDefinitionNode(
+ String name,
+ List<UntypedStructFieldDefinitionNode> fields,
+ Source source
+) implements UntypedNamespaceStatementNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java
new file mode 100644
index 00000000..b2e69866
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java
@@ -0,0 +1,10 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+public record UntypedStructFieldDefinitionNode(
+ String name,
+ UntypedTypeLevelExpressionNode type,
+ Source source
+) implements UntypedNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 831f5732..2bda39ed 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -452,6 +452,9 @@ public class Parser {
case KEYWORD_FUN ->
parseFunctionDefinition(tokens);
+ case KEYWORD_STRUCT ->
+ parseStructDefinition(tokens);
+
case KEYWORD_VAL ->
parseAssign(tokens);
@@ -556,6 +559,25 @@ public class Parser {
};
}
+ private static UntypedNamespaceStatementNode parseStructDefinition(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_STRUCT);
+
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
+
+ tokens.skip(TokenType.SYMBOL_PAREN_OPEN);
+ tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
+
+ tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+ tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedStructDefinitionNode(name, List.of(), source);
+ }
+
static UntypedExpressionNode parseSubExpression(TokenIterator<TokenType> tokens, OperatorPrecedence parentPrecedence) {
return parseExpression(tokens, Optional.of(parentPrecedence));
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 7175f51c..b12061f8 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -71,6 +71,9 @@ class DeclaredVariables {
VariableType.CONSTANT,
functionDefinition.source()
));
+
+ case UntypedStructDefinitionNode struct ->
+ throw new UnsupportedOperationException("TODO");
};
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index eaeadf1a..930efd85 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -673,12 +673,17 @@ public class TypeChecker {
dependencies
);
}
+
case UntypedFunctionDefinitionNode untypedFunctionDefinition -> {
dependencyChecker = dependencyChecker.addDeferredDependencies(
untypedFunctionDefinition.name(),
dependencies
);
}
+
+ case UntypedStructDefinitionNode untypedStruct -> {
+ throw new UnsupportedOperationException("TODO");
+ }
}
}
@@ -721,6 +726,9 @@ public class TypeChecker {
case UntypedFunctionDefinitionNode functionDefinition ->
typeCheckStepsFunctionDefinition(functionDefinition);
+
+ case UntypedStructDefinitionNode structDefinition ->
+ throw new UnsupportedOperationException("TODO");
};
}