diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-17 16:38:54 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-17 16:39:00 +0100 |
| commit | 891db26b0e9c1fe81b5b7f49d11a1e2a28af9987 (patch) | |
| tree | 2c119d910062a02979cb0b90c3b3cf7960c214da /src/main/java | |
| parent | 6587267906ea7b43270868b8bdee96bceed17602 (diff) | |
Parse tuple expressions
Diffstat (limited to 'src/main/java')
4 files changed, 38 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java index 729d8279..ad227d81 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.ast.untyped; public sealed interface UntypedExpressionNode extends UntypedNode - permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedIfNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode { + permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedIfNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode, UntypedTupleNode { } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java new file mode 100644 index 00000000..cf0107bb --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java @@ -0,0 +1,11 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +import java.util.List; + +public record UntypedTupleNode( + List<UntypedExpressionNode> elements, + Source source +) implements UntypedExpressionNode { +} diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 323c7dad..919256c3 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -455,6 +455,8 @@ public class Parser { case STRING -> parseStringLiteral(tokens); + case SYMBOL_HASH_PAREN_OPEN -> parseTuple(tokens); + default -> throw new UnexpectedTokenException("expression", tokens.peek()); }; @@ -607,6 +609,27 @@ public class Parser { }; } + private static UntypedExpressionNode parseTuple( + TokenIterator<TokenType> tokens + ) { + var start = tokens.position(); + + tokens.skip(TokenType.SYMBOL_HASH_PAREN_OPEN); + + var elements = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE), + () -> parseTopLevelExpression(tokens), + () -> tokens.trySkip(TokenType.SYMBOL_COMMA) + ); + + tokens.skip(TokenType.SYMBOL_PAREN_CLOSE); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedTupleNode(elements, source); + } + private static UntypedFunctionStatementNode parseWhile( TokenIterator<TokenType> tokens ) { diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index bc5ff8b1..1a523df0 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -371,6 +371,9 @@ public class TypeChecker { case UntypedStringLiteralNode untypedStringLiteral -> typeCheckStringLiteral(untypedStringLiteral, context); + + case UntypedTupleNode untypedTuple -> + throw new UnsupportedOperationException("TODO"); }; } |
