From cf52b6e8a2ebf85b4be8b9065a755f3481eb43db Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 8 Jul 2023 21:42:45 +0100 Subject: Parse if expressions --- .../java/org/shedlang/compiler/parser/Parser.java | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src/main/java/org/shedlang/compiler/parser') 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 tokens) { + var start = tokens.position(); + + var conditionalBranches = new ArrayList(); + var elseBody = List.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 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 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); -- cgit v1.2.3