From 045969708f21e19f852256f8bf934f4289b96495 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 23 Apr 2026 17:03:59 +0100 Subject: Add basic example --- .../hobgoblin/compiler/HobgoblinCompiler.java | 28 ++++++++++++++++++++++ .../filesystem/HobgoblinCompilerFiles.java | 13 ++++++++++ .../zwobble/hobgoblin/compiler/parser/Parser.java | 9 +++++++ .../hobgoblin/compiler/parser/TokenIterator.java | 2 +- 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/filesystem/HobgoblinCompilerFiles.java (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java new file mode 100644 index 0000000..9d95dae --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -0,0 +1,28 @@ +package org.zwobble.hobgoblin.compiler; + +import org.zwobble.hobgoblin.compiler.parser.Parser; +import org.zwobble.hobgoblin.compiler.types.NamespaceName; +import org.zwobble.sourcetext.SourceText; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; + +public class HobgoblinCompiler { + private HobgoblinCompiler() { + } + + public static void compile(Path projectRoot) throws IOException { + var sourceDirectory = projectRoot.resolve("src"); + var sourceFiles = sourceDirectory.toFile() + .listFiles(file -> file.toPath().toString().endsWith(".hob")); + for (var sourceFile : sourceFiles) { + // TODO: derive namespace name from source path + var namespaceName = NamespaceName.of(); + var sourceContents = Files.readString(sourceFile.toPath(), StandardCharsets.UTF_8); + var sourceText = SourceText.fromString(sourceFile.toPath().toString(), sourceContents); + var namespace = Parser.parseNamespace(sourceText, namespaceName); + } + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/filesystem/HobgoblinCompilerFiles.java b/src/main/java/org/zwobble/hobgoblin/compiler/filesystem/HobgoblinCompilerFiles.java new file mode 100644 index 0000000..5609313 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/filesystem/HobgoblinCompilerFiles.java @@ -0,0 +1,13 @@ +package org.zwobble.hobgoblin.compiler.filesystem; + +import java.nio.file.Path; + +public class HobgoblinCompilerFiles { + private HobgoblinCompilerFiles() { + } + + public static Path getRoot() { + // TODO: don't assume we're in the project root + return Path.of("."); + } +} 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 7a50bf5..fbf38bb 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java @@ -5,6 +5,7 @@ import org.zwobble.hobgoblin.compiler.sources.FileFragmentSource; import org.zwobble.hobgoblin.compiler.sources.Source; import org.zwobble.hobgoblin.compiler.types.NamespaceName; import org.zwobble.sourcetext.SourcePosition; +import org.zwobble.sourcetext.SourceText; import java.util.ArrayList; import java.util.List; @@ -16,6 +17,14 @@ public class Parser { } public static UntypedNamespaceNode parseNamespace( + SourceText sourceText, + NamespaceName namespaceName + ) { + var tokens = Tokenizer.tokenize(sourceText); + return parseNamespace(tokens.iterator(), namespaceName); + } + + static UntypedNamespaceNode parseNamespace( TokenIterator tokens, NamespaceName namespaceName ) { 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 a66ec35..0ae3d28 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java @@ -4,7 +4,7 @@ import org.zwobble.sourcetext.SourcePosition; import java.util.List; -public class TokenIterator { +class TokenIterator { private final List tokens; private int tokenIndex; private final Token tokenEnd; -- cgit v1.2.3