aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
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);
+ }
}