From ac6c30e9383cf4da05a98c8397e88f39cfa39834 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Oct 2023 22:45:37 +0100 Subject: Use namespace name parser in config parser --- .../org/shedlang/compiler/config/BinConfig.java | 6 ++--- .../org/shedlang/compiler/parser/StringParser.java | 29 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/parser/StringParser.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/config/BinConfig.java b/src/main/java/org/shedlang/compiler/config/BinConfig.java index 1fe9b17e..f0d733a2 100644 --- a/src/main/java/org/shedlang/compiler/config/BinConfig.java +++ b/src/main/java/org/shedlang/compiler/config/BinConfig.java @@ -1,18 +1,16 @@ package org.shedlang.compiler.config; +import org.shedlang.compiler.parser.StringParser; import org.shedlang.compiler.types.NamespaceName; import org.tomlj.TomlTable; -import java.util.Arrays; - public record BinConfig(String name, NamespaceName mainNamespace) { public static BinConfig fromToml(TomlTable table) { var name = table.getString("name"); var mainNamespaceString = table.getString("main-namespace"); // TODO: error checking - // TODO: extract namespace name parsing - var mainNamespace = new NamespaceName(Arrays.asList(mainNamespaceString.split("/"))); + var mainNamespace = StringParser.parseNamespaceName(mainNamespaceString); return new BinConfig(name, mainNamespace); } diff --git a/src/main/java/org/shedlang/compiler/parser/StringParser.java b/src/main/java/org/shedlang/compiler/parser/StringParser.java new file mode 100644 index 00000000..37a85667 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/parser/StringParser.java @@ -0,0 +1,29 @@ +package org.shedlang.compiler.parser; + +import org.shedlang.compiler.sources.Sources; +import org.shedlang.compiler.tokeniser.TokenIterator; +import org.shedlang.compiler.types.NamespaceName; + +import java.util.function.Function; + +import static org.shedlang.compiler.parser.Tokeniser.tokenise; + +public class StringParser { + private StringParser() { + } + + public static NamespaceName parseNamespaceName(String value) { + return parseString(value, tokens -> Parser.parseNamespaceName(tokens)); + } + + private static T parseString( + String sourceContents, + Function, T> parseTokens + ) { + var source = Sources.file("", sourceContents); + var tokens = tokenise(source); + var result = parseTokens.apply(tokens); + tokens.skip(TokenType.END); + return result; + } +} -- cgit v1.2.3