From 7d088b0a827b2ec7d32968ec36c376d13116d76d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 18 Apr 2026 13:36:24 +0100 Subject: Tokenize braces --- .../org/zwobble/hobgoblin/parser/Tokenizer.java | 48 ++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java b/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java index e616ec0..a642d76 100644 --- a/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java +++ b/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java @@ -21,9 +21,9 @@ class Tokenizer { if (trySkipWhitespace(iterator)) { // Skip whitespace. } else { - var identifierOrKeyword = tokenizeIdentifierOrKeyword(iterator); - if (identifierOrKeyword.isPresent()) { - tokens.add(identifierOrKeyword.get()); + var token = tokenizeToken(iterator); + if (token.isPresent()) { + tokens.add(token.get()); } else { throw ParseError.unexpectedTextError( "token", @@ -37,6 +37,24 @@ class Tokenizer { return tokens; } + private static Optional tokenizeToken(CharacterIterator iterator) { + var identifierOrKeyword = tokenizeIdentifierOrKeyword(iterator); + if (identifierOrKeyword.isPresent()) { + return identifierOrKeyword; + } + + var symbol = tokenizeSymbol(iterator); + if (symbol.isPresent()) { + return symbol; + } + + throw ParseError.unexpectedTextError( + "token", + describeCharacter(iterator.peek()), + iterator.characterSourceRange() + ); + } + private static boolean trySkipWhitespace(CharacterIterator iterator) { var whitespace = false; @@ -75,6 +93,30 @@ class Tokenizer { return Optional.of(token); } + private static Optional tokenizeSymbol(CharacterIterator iterator) { + TokenType tokenType; + var start = iterator.position(); + + switch (iterator.peek()) { + case '{': + tokenType = TokenType.SYMBOL_BRACE_OPEN; + iterator.skip(); + break; + + case '}': + tokenType = TokenType.SYMBOL_BRACE_CLOSE; + iterator.skip(); + break; + + default: + return Optional.empty(); + } + + var end = iterator.position(); + var token = new Token(tokenType, start.to(end)); + return Optional.of(token); + } + private static String describeCharacter(int character) { // TODO: handle characters that should be escaped if (character == -1) { -- cgit v1.2.3