diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-31 19:09:16 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-31 19:09:16 +0000 |
| commit | 7a72d57dae13ab993baaa77f54023c062e56025d (patch) | |
| tree | 66399c2e1e96c9d1fd3797d26d7efd08d532511d /src/main/java | |
| parent | 01193de5040c7200de359ed0775b9ec5c7537ca2 (diff) | |
Parse effect functions
Diffstat (limited to 'src/main/java')
3 files changed, 59 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionFunctionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionFunctionNode.java new file mode 100644 index 00000000..8940eb24 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionFunctionNode.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +public record UntypedEffectDefinitionFunctionNode( + String name, + UntypedFunctionTypeNode type, + Source source +) implements UntypedNode { +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java index 740c7fcb..48e6fdf0 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java @@ -3,9 +3,12 @@ package org.shedlang.compiler.ast.untyped; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.types.Visibility; +import java.util.List; + public record UntypedEffectDefinitionNode( String name, Visibility visibility, + List<UntypedEffectDefinitionFunctionNode> functions, Source source ) implements UntypedNamespaceStatementNode, UntypedVariableDeclarationNode { } diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 3efdc40b..46a175f0 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -213,12 +213,57 @@ public class Parser { var name = tokens.nextValue(TokenType.IDENTIFIER); tokens.skip(TokenType.SYMBOL_BRACE_OPEN); + + var functions = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE), + () -> parseEffectDefinitionFunction(tokens), + () -> true + ); + tokens.skip(TokenType.SYMBOL_BRACE_CLOSE); var end = tokens.position(); var source = start.to(end); - return new UntypedEffectDefinitionNode(name, visibility, source); + return new UntypedEffectDefinitionNode(name, visibility, functions, source); + } + + private static UntypedEffectDefinitionFunctionNode parseEffectDefinitionFunction( + TokenIterator<TokenType> tokens + ) { + var start = tokens.position(); + + tokens.skip(TokenType.KEYWORD_FUN); + + var name = tokens.nextValue(TokenType.IDENTIFIER); + + var type = parseEffectDefinitionFunctionType(tokens); + + tokens.skip(TokenType.SYMBOL_SEMICOLON); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedEffectDefinitionFunctionNode(name, type, source); + } + + private static UntypedFunctionTypeNode parseEffectDefinitionFunctionType( + TokenIterator<TokenType> tokens + ) { + var start = tokens.position(); + + tokens.skip(TokenType.SYMBOL_PAREN_OPEN); + var params = parseParamTypes(tokens); + tokens.skip(TokenType.SYMBOL_PAREN_CLOSE); + + tokens.skip(TokenType.SYMBOL_THIN_ARROW); + + var returnType = parseTopLevelTypeLevelExpression(tokens); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedFunctionTypeNode(params, Optional.empty(), returnType, source); } private static final Map<TokenType, OperationParser> OPERATION_PARSERS = Stream.of( |
