aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
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/shedlang/compiler/parser
parentd2df851ca20b0ec02cb3450c861288d65d45f165 (diff)
Parse imports in namespace
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
-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
3 files changed, 29 insertions, 1 deletions
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, "\\)"),