summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-10 15:15:31 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-10 15:15:31 +0100
commit193a62fa52e360ee76cca3d0f6bdbe2f6a69602a (patch)
tree09a0a5399d4088128806d0adeb567943fca1be0a /src/main
parentf7da18665f7f672b61bb6b0a7bbe5d2f32977890 (diff)
Tokenize doc comments
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java27
2 files changed, 28 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java
index a0b36e7..ef1c9dc 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java
@@ -1,6 +1,7 @@
package org.zwobble.hobgoblin.compiler.parser;
enum TokenType {
+ DOC_COMMENT,
END,
IDENTIFIER,
WHITESPACE,
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java
index 1a110f7..1311df3 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java
@@ -49,6 +49,11 @@ class Tokenizer {
return symbol;
}
+ var docComment = tokenizeDocComment(iterator);
+ if (docComment.isPresent()) {
+ return docComment;
+ }
+
throw ParseError.unexpectedTextError(
"token",
describeCharacter(iterator.peek()),
@@ -71,6 +76,24 @@ class Tokenizer {
return Character.isWhitespace(character);
}
+ private static Optional<Token> tokenizeDocComment(CharacterIterator iterator) {
+ if (!"///".contentEquals(iterator.peekSequence(3))) {
+ return Optional.empty();
+ }
+
+ var start = iterator.position();
+ while (!iterator.isEnd() && iterator.peek() != '\n') {
+ iterator.skip();
+ }
+ if (iterator.peek() == '\n') {
+ iterator.skip();
+ }
+ var end = iterator.position();
+
+ var token = new Token(TokenType.DOC_COMMENT, start.to(end));
+ return Optional.of(token);
+ }
+
private static Optional<Token> tokenizeIdentifierOrKeyword(CharacterIterator iterator) {
if (!Character.isAlphabetic(iterator.peek())) {
return Optional.empty();
@@ -177,6 +200,10 @@ class Tokenizer {
return this.iterator.peek();
}
+ CharSequence peekSequence(int length) {
+ return this.iterator.peekSequence(length);
+ }
+
void skip() {
this.iterator.skip();
}