From 7c358460db1c42a5b7e79b7c6706ebf2adcff39f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 6 Jun 2023 19:15:42 +0100 Subject: Parse references --- .../compiler/ast/UntypedExpressionNode.java | 2 +- .../compiler/ast/UntypedReferenceNode.java | 6 ++++++ .../java/org/shedlang/compiler/parser/Parser.java | 25 +++++++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/UntypedReferenceNode.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/UntypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/UntypedExpressionNode.java index 03988b0d..0799550b 100644 --- a/src/main/java/org/shedlang/compiler/ast/UntypedExpressionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/UntypedExpressionNode.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.ast; public sealed interface UntypedExpressionNode extends UntypedNode - permits UntypedStringLiteralNode { + permits UntypedReferenceNode, UntypedStringLiteralNode { } diff --git a/src/main/java/org/shedlang/compiler/ast/UntypedReferenceNode.java b/src/main/java/org/shedlang/compiler/ast/UntypedReferenceNode.java new file mode 100644 index 00000000..721a409f --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/UntypedReferenceNode.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.ast; + +import org.shedlang.compiler.sources.Source; + +public record UntypedReferenceNode(String name, 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 0e838b28..d4383fda 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.parser; import org.shedlang.compiler.ast.UntypedExpressionNode; import org.shedlang.compiler.ast.UntypedNamespaceNode; +import org.shedlang.compiler.ast.UntypedReferenceNode; import org.shedlang.compiler.ast.UntypedStringLiteralNode; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.tokeniser.TokenIterator; @@ -54,11 +55,14 @@ public class Parser { } static UntypedExpressionNode parseTopLevelExpression(TokenIterator tokens) { - if (tokens.isNext(TokenType.STRING)) { - return parseStringLiteral(tokens); - } else { - throw new UnexpectedTokenException("expression", tokens.peek()); - } + return switch (tokens.peek().tokenType()) { + + case IDENTIFIER -> parseReference(tokens); + + case STRING -> parseStringLiteral(tokens); + + default -> throw new UnexpectedTokenException("expression", tokens.peek()); + }; } static UntypedNamespaceNode parseNamespace(TokenIterator tokens) { @@ -68,4 +72,15 @@ public class Parser { var source = start.to(end); return new UntypedNamespaceNode(source); } + + private static UntypedExpressionNode parseReference(TokenIterator tokens) { + var start = tokens.position(); + + var name = tokens.nextValue(TokenType.IDENTIFIER); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedReferenceNode(name, source); + } } -- cgit v1.2.3