diff --git a/src/ZoneCodeGeneratorLib/Parsing/Impl/AbstractLexer.h b/src/ZoneCodeGeneratorLib/Parsing/Impl/AbstractLexer.h index 798a8ba6..c77df139 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Impl/AbstractLexer.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Impl/AbstractLexer.h @@ -177,7 +177,7 @@ protected: if (numberLength == 0 || isalnum(*end) || *end == '_') throw ParsingException(GetPreviousCharacterPos(), "Invalid hex number"); - m_current_line_offset += numberLength; + m_current_line_offset += numberLength - 1; } _NODISCARD bool IsIntegerNumber() const diff --git a/test/ZoneCodeGeneratorLibTests/Parsing/Header/Impl/HeaderLexerTests.cpp b/test/ZoneCodeGeneratorLibTests/Parsing/Header/Impl/HeaderLexerTests.cpp index 68f09fb3..df8530b8 100644 --- a/test/ZoneCodeGeneratorLibTests/Parsing/Header/Impl/HeaderLexerTests.cpp +++ b/test/ZoneCodeGeneratorLibTests/Parsing/Header/Impl/HeaderLexerTests.cpp @@ -92,6 +92,25 @@ namespace test::parsing::header::impl::header_lexer REQUIRE(lexer.GetToken(0).m_type == HeaderParserValueType::END_OF_FILE); } + TEST_CASE("HeaderLexer: Ensure can parse simple hex numbers surrounded by symbols", "[parsing][header]") + { + const std::vector lines + { + "0x25:0xABC,0x1a4", + }; + + MockParserLineStream mockStream(lines); + HeaderLexer lexer(&mockStream); + + ExpectIntegerToken(lexer, 0x25); + ExpectCharacterToken(lexer, ':'); + ExpectIntegerToken(lexer, 0xABC); + ExpectCharacterToken(lexer, ','); + ExpectIntegerToken(lexer, 0x1a4); + + REQUIRE(lexer.GetToken(0).m_type == HeaderParserValueType::END_OF_FILE); + } + TEST_CASE("HeaderLexer: Ensure throws exception when parsing incomplete hex number", "[parsing][header]") { const std::vector lines