#pragma once #include #include #include #include #include #include enum { CLEX_ext_single_char = CLEX_first_unused_token, CLEX_ext_double_colon, CLEX_ext_dot_dot_dot, CLEX_ext_COUNT, }; struct StbLexerToken { std::string text; union { double lexerRealNumber; long lexerIntNumber; }; // Can either be CLEX_* or CLEX_ext_* values int type; }; bool StbTokenIsSingleChar(int lexerToken); bool StbTokenIsMultiChar(int lexerToken); std::string CombineTokens(std::span tokens); struct CodegenLexer { std::vector tokens; size_t idx = 0; void InitializeFrom(std::string_view source); const StbLexerToken& Current() const; const StbLexerToken* TryConsumeToken(int type); const StbLexerToken* TryConsumeSingleCharToken(char c); void SkipUntilToken(int type); void SkipUntilTokenSingleChar(char c); };