From 7a72d57dae13ab993baaa77f54023c062e56025d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 31 Oct 2023 19:09:16 +0000 Subject: Parse effect functions --- .../java/org/shedlang/compiler/parser/Parser.java | 47 +++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'src/main/java/org/shedlang/compiler/parser') 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 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 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 OPERATION_PARSERS = Stream.of( -- cgit v1.2.3