#ifndef ELOHIMSCRIPT_LEXTOKEN_HPP #define ELOHIMSCRIPT_LEXTOKEN_HPP #include #include #include "LexTokenKind.hpp" namespace ElohimScript::Parser { class LexToken { friend class Lexer; std::unique_ptr _next; public: virtual ~LexToken() = default; [[nodiscard]] virtual LexTokenKind GetKind() const noexcept = 0; [[nodiscard]] const std::unique_ptr& GetNext() const noexcept { return _next; } }; template class LexTokenImpl : public LexToken { public: LexTokenImpl() = default; [[nodiscard]] LexTokenKind GetKind() const noexcept override { return kind; } }; class IntegerLiteral : public LexTokenImpl { uint64_t _value; public: IntegerLiteral(uint64_t value) : _value(value) {} [[nodiscard]] uint64_t GetValue() const noexcept { return _value; } }; class FloatLiteral : public LexTokenImpl { double _value; public: FloatLiteral(double value) : _value(value) {} [[nodiscard]] double GetValue() const noexcept { return _value; } }; class StringLiteral : public LexTokenImpl { std::u8string _value; public: StringLiteral(std::u8string value) : _value(std::move(value)) {} [[nodiscard]] const std::u8string& GetValue() const noexcept { return _value; } }; class IdentifierToken : public LexTokenImpl{ std::u8string _value; public: IdentifierToken(std::u8string value) : _value(std::move(value)) {} [[nodiscard]] const std::u8string& GetValue() const noexcept { return _value; } }; } #endif // ELOHIMSCRIPT_LEXTOKEN_HPP