summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-30 17:26:52 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-30 17:26:52 +0100
commit57ff00acc01cf5082601cd00a125afa02fa3cba8 (patch)
tree34a4de4cd5536f967c0c2592013b9581627ba5d5
parent8f27dc73c45a8311233caf50f639b27ea1c99700 (diff)
Tokenize forward slash
-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.java19
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/parser/TokenizerTests.java11
3 files changed, 26 insertions, 5 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 e25a9f0..63ff5e1 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java
@@ -16,6 +16,7 @@ enum TokenType {
SYMBOL_BRACE_CLOSE,
SYMBOL_COLON,
SYMBOL_COMMA,
+ SYMBOL_FORWARD_SLASH,
SYMBOL_SEMICOLON,
SYMBOL_SQUARE_OPEN,
SYMBOL_SQUARE_CLOSE,
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 7119cfd..35bbeda 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java
@@ -44,16 +44,16 @@ class Tokenizer {
return identifierOrKeyword;
}
- var symbol = tokenizeSymbol(iterator);
- if (symbol.isPresent()) {
- return symbol;
- }
-
var docComment = tokenizeDocComment(iterator);
if (docComment.isPresent()) {
return docComment;
}
+ var symbol = tokenizeSymbol(iterator);
+ if (symbol.isPresent()) {
+ return symbol;
+ }
+
throw ParseError.unexpectedTextError(
"token",
describeCharacter(iterator.peek()),
@@ -150,6 +150,11 @@ class Tokenizer {
iterator.skip();
break;
+ case '/':
+ tokenType = TokenType.SYMBOL_FORWARD_SLASH;
+ iterator.skip();
+ break;
+
case ';':
tokenType = TokenType.SYMBOL_SEMICOLON;
iterator.skip();
@@ -203,6 +208,10 @@ class Tokenizer {
}
CharSequence peekSequence(int length) {
+ // TODO: fix this in source-text
+ if (length > this.iterator.remaining()) {
+ length = this.iterator.remaining();
+ }
return this.iterator.peekSequence(length);
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/parser/TokenizerTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/parser/TokenizerTests.java
index e8dfd36..815dede 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/parser/TokenizerTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/parser/TokenizerTests.java
@@ -140,6 +140,17 @@ public class TokenizerTests {
}
@Test
+ public void symbolForwardSlashIsTokenized() {
+ var sourceText = SourceText.fromString("<string>", "/");
+
+ var tokens = Tokenizer.tokenize(sourceText);
+
+ assertThat(tokens.tokens(), isSequence(
+ equalTo(new Token(TokenType.SYMBOL_FORWARD_SLASH, sourceRange(sourceText, 0, 1)))
+ ));
+ }
+
+ @Test
public void symbolSemicolonIsTokenized() {
var sourceText = SourceText.fromString("<string>", ";");