From dda81e22bd1274d54e627e284c49ded9aa1c0b04 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 18 Apr 2026 13:28:04 +0100 Subject: Skip whitespace --- .../org/zwobble/hobgoblin/parser/Tokenizer.java | 35 +++++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java b/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java index f4e0773..e616ec0 100644 --- a/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java +++ b/src/main/java/org/zwobble/hobgoblin/parser/Tokenizer.java @@ -18,21 +18,40 @@ class Tokenizer { var tokens = new ArrayList(); while (!iterator.isEnd()) { - var identifierOrKeyword = tokenizeIdentifierOrKeyword(iterator); - if (identifierOrKeyword.isPresent()) { - tokens.add(identifierOrKeyword.get()); + if (trySkipWhitespace(iterator)) { + // Skip whitespace. } else { - throw ParseError.unexpectedTextError( - "token", - describeCharacter(iterator.peek()), - iterator.characterSourceRange() - ); + var identifierOrKeyword = tokenizeIdentifierOrKeyword(iterator); + if (identifierOrKeyword.isPresent()) { + tokens.add(identifierOrKeyword.get()); + } else { + throw ParseError.unexpectedTextError( + "token", + describeCharacter(iterator.peek()), + iterator.characterSourceRange() + ); + } } } return tokens; } + private static boolean trySkipWhitespace(CharacterIterator iterator) { + var whitespace = false; + + while (isWhitespace(iterator.peek())) { + iterator.skip(); + whitespace = true; + } + + return whitespace; + } + + private static boolean isWhitespace(int character) { + return Character.isWhitespace(character); + } + private static Optional tokenizeIdentifierOrKeyword(CharacterIterator iterator) { if (!Character.isAlphabetic(iterator.peek())) { return Optional.empty(); -- cgit v1.2.3