aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-09 19:13:02 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-09 19:13:02 +0100
commitbf55e95953edeefad8e83c034bfb4920d99c29ba (patch)
tree7e5e5060bf88af358e90e4d03cccc4c80f7630a3 /src/main/java/org/shedlang/compiler/parser
parentde846b1c61ba146da38be8a347d1c70dece75e52 (diff)
Add UntypedBlockNode
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 3243eb17..184c3fdd 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -104,11 +104,16 @@ public class Parser {
return new UntypedArgsNode(positional, named, argsSource);
}
- private static List<UntypedFunctionStatementNode> parseBlock(TokenIterator<TokenType> tokens) {
+ private static UntypedBlockNode parseBlock(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
if (tokens.trySkip(TokenType.SYMBOL_BRACE_CLOSE)) {
- return List.of();
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedBlockNode(List.of(), source);
}
var body = new ArrayList<UntypedFunctionStatementNode>();
@@ -123,7 +128,11 @@ public class Parser {
statement.behaviour() == UntypedFunctionStatementBehaviour.BLOCK_RETURN
) {
tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
- return body;
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedBlockNode(body, source);
}
}
}
@@ -273,7 +282,7 @@ public class Parser {
var start = tokens.position();
var conditionalBranches = new ArrayList<UntypedConditionalBranchNode>();
- var elseBody = List.<UntypedFunctionStatementNode>of();
+ var elseBody = Optional.<UntypedBlockNode>empty();
while (true) {
var conditionalBranch = parseConditionalBranch(tokens);
@@ -284,7 +293,7 @@ public class Parser {
}
if (!tokens.isNext(TokenType.KEYWORD_IF)) {
- elseBody = parseBlock(tokens);
+ elseBody = Optional.of(parseBlock(tokens));
break;
}
@@ -295,7 +304,7 @@ public class Parser {
return new UntypedIfNode(
conditionalBranches,
- elseBody,
+ elseBody.orElseGet(() -> new UntypedBlockNode(List.of(), end)),
source
);
}