From 0cae53a3d119f71a18b878e6e8813aae65b8aca8 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Tue, 21 Mar 2023 14:32:30 +0100 Subject: [PATCH] Update Token class with subtoken and int conversion --- src/lexer/Token.cpp | 20 ++++++++++++++++++++ src/lexer/Token.h | 13 ++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/lexer/Token.cpp b/src/lexer/Token.cpp index 01712e3..fc51001 100644 --- a/src/lexer/Token.cpp +++ b/src/lexer/Token.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Token.h" Token::Token(Token::Type type) : type(type) {} @@ -23,6 +24,25 @@ auto Token::getTypeName() const -> std::string { "UNEXPECTED"}[type]; } +auto Token::subtoken(uint8_t pos, uint8_t len) const -> Token { + return std::move(Token(type, lexeme.substr(pos, len))); +} + Token::operator std::string_view() const { return lexeme; } + +Token::operator std::string() const { + return lexeme; +} + +// https://stackoverflow.com/questions/56634507/safely-convert-stdstring-view-to-int-like-stoi-or-atoi#answer-65675200 +Token::operator uint8_t() const { + uint8_t out; + const std::from_chars_result result = std::from_chars(lexeme.data(), lexeme.data() + lexeme.size(), out); + if (result.ec == std::errc::invalid_argument || result.ec == std::errc::result_out_of_range) + { + throw "Conversion Error: Can't convert Token to uint8_t!"; + } + return out; +} diff --git a/src/lexer/Token.h b/src/lexer/Token.h index 2996589..3296b82 100644 --- a/src/lexer/Token.h +++ b/src/lexer/Token.h @@ -35,9 +35,9 @@ public: auto operator=(const Token ©) -> Token & = default; - Token(Token &&move) = default; + Token(Token &&move) noexcept = default; - auto operator=(Token &&move) -> Token & = default; + auto operator=(Token &&move) noexcept -> Token & = default; ~Token() = default; @@ -45,13 +45,16 @@ public: [[nodiscard]] auto getTypeName() const -> std::string; + [[nodiscard]] auto subtoken(uint8_t pos, uint8_t len) const -> Token; + explicit operator std::string_view() const; + explicit operator std::string() const; + + explicit operator uint8_t() const; + private: Type type; - - // ! The Token only contains a reference to the string kept inside the Lexer. - // ! If the Lexer is gone, all Tokens will be invalid! std::string lexeme; };