diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:15:42 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:15:42 +0100 |
| commit | 7c358460db1c42a5b7e79b7c6706ebf2adcff39f (patch) | |
| tree | effac29e2ecb2d5adb60d49d49469d957a47b4e2 /src/main/java | |
| parent | 24019585814742baa6c8bee85b8373be319fbaa8 (diff) | |
Parse references
Diffstat (limited to 'src/main/java')
3 files changed, 27 insertions, 6 deletions
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<TokenType> 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<TokenType> tokens) { @@ -68,4 +72,15 @@ public class Parser { var source = start.to(end); return new UntypedNamespaceNode(source); } + + private static UntypedExpressionNode parseReference(TokenIterator<TokenType> 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); + } } |
