From c57ca9e4d30e07d2ff0ba2f113e905a3c3794c75 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 20 Oct 2023 17:51:33 +0100 Subject: Parse imports in namespace --- .../compiler/ast/untyped/UntypedImportNode.java | 7 ++++++ .../compiler/ast/untyped/UntypedNamespaceNode.java | 8 ++++--- .../java/org/shedlang/compiler/parser/Parser.java | 28 +++++++++++++++++++++- .../org/shedlang/compiler/parser/TokenType.java | 1 + .../org/shedlang/compiler/parser/Tokeniser.java | 1 + 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedImportNode.java (limited to 'src/main/java') 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 imports, List 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 imports, PVector 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 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 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 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, "\\)"), -- cgit v1.2.3