diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-09 19:13:02 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-09 19:13:02 +0100 |
| commit | bf55e95953edeefad8e83c034bfb4920d99c29ba (patch) | |
| tree | 7e5e5060bf88af358e90e4d03cccc4c80f7630a3 /src/main/java/org/shedlang/compiler/parser | |
| parent | de846b1c61ba146da38be8a347d1c70dece75e52 (diff) | |
Add UntypedBlockNode
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 21 |
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 ); } |
