aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-31 19:09:16 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-31 19:09:16 +0000
commit7a72d57dae13ab993baaa77f54023c062e56025d (patch)
tree66399c2e1e96c9d1fd3797d26d7efd08d532511d /src/main/java
parent01193de5040c7200de359ed0775b9ec5c7537ca2 (diff)
Parse effect functions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionFunctionNode.java10
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java47
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(