aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-02 18:59:09 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-02 19:00:09 +0000
commit71544066ce3b74c18973e00348ea44faf052d5e5 (patch)
tree305635d30c993db52a75512c37704aa60424b1a3 /src/main/java/org/shedlang/compiler/parser
parent7f6bc2dcceb75538993af15167ca291db63107a8 (diff)
Parse try expressions
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 35efa5ab..1ed7799e 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -363,7 +363,7 @@ public class Parser {
}
}
- private static UntypedNamespaceStatementNode parseFunctionDefinition(TokenIterator<TokenType> tokens) {
+ private static UntypedFunctionDefinitionNode parseFunctionDefinition(TokenIterator<TokenType> tokens) {
var start = tokens.position();
var visibility = parseVisibility(tokens);
@@ -808,6 +808,8 @@ public class Parser {
case KEYWORD_FN -> parseFunctionExpression(tokens);
+ case KEYWORD_TRY -> parseTry(tokens);
+
case KEYWORD_WHEN -> parseWhen(tokens);
case STRING -> parseStringLiteral(tokens);
@@ -1054,6 +1056,35 @@ public class Parser {
};
}
+ private static UntypedExpressionNode parseTry(
+ TokenIterator<TokenType> tokens
+ ) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_TRY);
+
+ var body = parseBlock(tokens);
+
+ tokens.skip(TokenType.KEYWORD_HANDLE);
+
+ var handledEffect = parseTopLevelTypeLevelExpression(tokens);
+
+ tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+
+ var handlers = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE),
+ () -> parseFunctionDefinition(tokens),
+ () -> true
+ );
+
+ tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedTryNode(body, handledEffect, handlers, source);
+ }
+
private static UntypedExpressionNode parseTuple(
TokenIterator<TokenType> tokens
) {