aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-06 19:15:42 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-06 19:15:42 +0100
commit7c358460db1c42a5b7e79b7c6706ebf2adcff39f (patch)
treeeffac29e2ecb2d5adb60d49d49469d957a47b4e2 /src/main/java
parent24019585814742baa6c8bee85b8373be319fbaa8 (diff)
Parse references
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/UntypedExpressionNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/UntypedReferenceNode.java6
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java25
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);
+ }
}