summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java10
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelReferenceNode.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java11
5 files changed, 52 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java
new file mode 100644
index 0000000..0e21663
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStructFieldDefinitionNode.java
@@ -0,0 +1,10 @@
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+import org.zwobble.hobgoblin.compiler.sources.Source;
+
+public record UntypedStructFieldDefinitionNode(
+ String name,
+ UntypedTypeLevelExpressionNode type,
+ Source source
+) implements UntypedNode {
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
new file mode 100644
index 0000000..871393d
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
@@ -0,0 +1,4 @@
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedTypeLevelReferenceNode {
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelReferenceNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelReferenceNode.java
new file mode 100644
index 0000000..018655e
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelReferenceNode.java
@@ -0,0 +1,9 @@
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+import org.zwobble.hobgoblin.compiler.sources.Source;
+
+public record UntypedTypeLevelReferenceNode(
+ String name,
+ Source source
+) implements UntypedTypeLevelExpressionNode {
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
index 704f34f..4411306 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -1,6 +1,8 @@
package org.zwobble.hobgoblin.compiler.parser;
import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNamespaceNode;
+import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelExpressionNode;
+import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelReferenceNode;
import org.zwobble.hobgoblin.compiler.sources.FileFragmentSource;
import org.zwobble.hobgoblin.compiler.sources.Source;
import org.zwobble.hobgoblin.compiler.types.NamespaceName;
@@ -28,6 +30,22 @@ public class Parser {
);
}
+ public static UntypedTypeLevelExpressionNode parseTypeLevelExpression(
+ TokenIterator tokens
+ ) {
+ var start = tokens.startPosition();
+
+ var name = tokens.next(TokenType.IDENTIFIER);
+
+ var end = tokens.endPosition();
+ var source = createSource(start, end);
+
+ return new UntypedTypeLevelReferenceNode(
+ name.charSequence().toString(),
+ source
+ );
+ }
+
private static Source createSource(SourcePosition start, SourcePosition end) {
return new FileFragmentSource(start.to(end));
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
index 9e1dd9c..cb59e79 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
@@ -19,6 +19,17 @@ class TokenIterator {
return this.getAbsolute(this.tokenIndex);
}
+ public Token next(TokenType tokenType) {
+ var token = peek();
+ if (token.tokenType().equals(tokenType)) {
+ this.tokenIndex++;
+ return token;
+ } else {
+ // TODO: better expected string
+ throw new UnexpectedTokenError(tokenType.toString(), token);
+ }
+ }
+
private Token getAbsolute(int index) {
if (index < this.tokens.size()) {
return this.tokens.get(index);