diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-27 20:22:34 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-27 20:22:34 +0100 |
| commit | a0074f328bfabc0c28d7e5b1202761daaa265fc8 (patch) | |
| tree | 28336e56dbf2341e6630d5ea27f7a9348b46ccde /src/main/java | |
| parent | 71e8f7645a022dbe913cb0e5ea3a1ab5e9b33a0f (diff) | |
Parse struct without fields
Diffstat (limited to 'src/main/java')
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"); }; } |
