diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-08 21:42:45 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-08 21:42:45 +0100 |
| commit | cf52b6e8a2ebf85b4be8b9065a755f3481eb43db (patch) | |
| tree | 553f99eee5123f7b06ae34ff657d975adf37b240 /src/main/java/org/shedlang/compiler/parser | |
| parent | b018be7fb57e79b62e727c1fb00bfd474888ddf8 (diff) | |
Parse if expressions
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index bfb756db..4dd59eb4 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -248,6 +248,54 @@ public class Parser { }; } + private static UntypedExpressionNode parseIf(TokenIterator<TokenType> tokens) { + var start = tokens.position(); + + var conditionalBranches = new ArrayList<UntypedConditionalBranchNode>(); + var elseBody = List.<UntypedFunctionStatementNode>of(); + + while (true) { + var conditionalBranch = parseConditionalBranch(tokens); + conditionalBranches.add(conditionalBranch); + + if (!tokens.trySkip(TokenType.KEYWORD_ELSE)) { + break; + } + + if (!tokens.isNext(TokenType.KEYWORD_IF)) { + elseBody = parseBlock(tokens); + break; + } + + } + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedIfNode( + conditionalBranches, + elseBody, + source + ); + } + + private static UntypedConditionalBranchNode parseConditionalBranch(TokenIterator<TokenType> tokens) { + var start = tokens.position(); + + tokens.skip(TokenType.KEYWORD_IF); + + tokens.skip(TokenType.SYMBOL_PAREN_OPEN); + var condition = parseTopLevelExpression(tokens); + tokens.skip(TokenType.SYMBOL_PAREN_CLOSE); + + var body = parseBlock(tokens); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedConditionalBranchNode(condition, body, source); + } + private static UntypedExpressionNode parseInt(TokenIterator<TokenType> tokens) { var start = tokens.position(); @@ -333,6 +381,8 @@ public class Parser { case IDENTIFIER -> parseReference(tokens); case INT -> parseInt(tokens); + + case KEYWORD_IF -> parseIf(tokens); case STRING -> parseStringLiteral(tokens); |
