aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-20 17:51:33 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-20 17:51:33 +0100
commitc57ca9e4d30e07d2ff0ba2f113e905a3c3794c75 (patch)
tree0ad284e2ac442edd68aa32e171f84a1dcfc2ec8c /src/main/java/org
parentd2df851ca20b0ec02cb3450c861288d65d45f165 (diff)
Parse imports in namespace
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedImportNode.java7
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java8
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java28
-rw-r--r--src/main/java/org/shedlang/compiler/parser/TokenType.java1
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Tokeniser.java1
5 files changed, 41 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedImportNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedImportNode.java
new file mode 100644
index 00000000..c21f9c56
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedImportNode.java
@@ -0,0 +1,7 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.NamespaceName;
+
+public record UntypedImportNode(NamespaceName namespaceName, Source source) implements UntypedNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java
index f661e2ea..4a2f68c3 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java
@@ -10,23 +10,25 @@ import java.util.List;
public record UntypedNamespaceNode(
NamespaceName namespaceName,
+ List<UntypedImportNode> imports,
List<UntypedNamespaceStatementNode> body,
Source source
) implements UntypedNode {
public static Builder builder() {
- return new Builder(NamespaceName.of("Default"), P.vector());
+ return new Builder(NamespaceName.of("Default"), P.vector(), P.vector());
}
public record Builder(
NamespaceName namespaceName,
+ PVector<UntypedImportNode> imports,
PVector<UntypedNamespaceStatementNode> body
) {
public UntypedNamespaceNode build() {
- return new UntypedNamespaceNode(namespaceName, body, Sources.NULL);
+ return new UntypedNamespaceNode(namespaceName, imports, body, Sources.NULL);
}
public Builder addStatement(UntypedNamespaceStatementNode statement) {
- return new Builder(namespaceName, body.plus(statement));
+ return new Builder(namespaceName, imports, body.plus(statement));
}
}
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 71490933..2122c97c 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -417,6 +417,26 @@ public class Parser {
return new UntypedConditionalBranchNode(condition, body, source);
}
+ private static UntypedImportNode parseImport(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_IMPORT);
+
+ var namespaceNameParts = parseOneOrMoreNoTrailingSeparator(
+ () -> tokens.nextValue(TokenType.IDENTIFIER),
+ () -> tokens.trySkip(TokenType.SYMBOL_FORWARD_SLASH)
+ );
+ var namespaceName = new NamespaceName(namespaceNameParts);
+
+ tokens.skip(TokenType.SYMBOL_SEMICOLON);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedImportNode(namespaceName, source);
+
+ }
+
private static UntypedExpressionNode parseInt(TokenIterator<TokenType> tokens) {
var start = tokens.position();
@@ -680,6 +700,12 @@ public class Parser {
NamespaceName namespaceName
) {
var start = tokens.position();
+
+ var imports = parseMany(
+ () -> !tokens.isNext(TokenType.KEYWORD_IMPORT),
+ () -> parseImport(tokens),
+ () -> true
+ );
var body = parseMany(
() -> tokens.isNext(TokenType.END),
@@ -690,7 +716,7 @@ public class Parser {
var end = tokens.position();
var source = start.to(end);
- return new UntypedNamespaceNode(namespaceName, body, source);
+ return new UntypedNamespaceNode(namespaceName, imports, body, source);
}
private static UntypedExpressionNode parseReference(TokenIterator<TokenType> tokens) {
diff --git a/src/main/java/org/shedlang/compiler/parser/TokenType.java b/src/main/java/org/shedlang/compiler/parser/TokenType.java
index d49f2b7d..0f83083e 100644
--- a/src/main/java/org/shedlang/compiler/parser/TokenType.java
+++ b/src/main/java/org/shedlang/compiler/parser/TokenType.java
@@ -36,6 +36,7 @@ public enum TokenType {
SYMBOL_DOT,
SYMBOL_EQUALS,
SYMBOL_EQUALS_EQUALS,
+ SYMBOL_FORWARD_SLASH,
SYMBOL_HASH_PAREN_OPEN,
SYMBOL_MINUS,
SYMBOL_PAREN_OPEN,
diff --git a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
index f59775e1..c857418d 100644
--- a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
@@ -53,6 +53,7 @@ public class Tokeniser {
RegexTokeniser.rule(TokenType.SYMBOL_COMMA, ","),
RegexTokeniser.rule(TokenType.SYMBOL_DOT, "\\."),
RegexTokeniser.rule(TokenType.SYMBOL_EQUALS, "="),
+ RegexTokeniser.rule(TokenType.SYMBOL_FORWARD_SLASH, "/"),
RegexTokeniser.rule(TokenType.SYMBOL_MINUS, "-"),
RegexTokeniser.rule(TokenType.SYMBOL_PAREN_OPEN, "\\("),
RegexTokeniser.rule(TokenType.SYMBOL_PAREN_CLOSE, "\\)"),