#ifndef PORYGONLANG_TOKEN_HPP #define PORYGONLANG_TOKEN_HPP #include #include #include "TokenKind.hpp" #include "../Utilities/HashedString.hpp" using namespace std; using namespace Porygon::Utilities; namespace Porygon::Parser { class Token { const unsigned int _position; const unsigned int _length; public: virtual const TokenKind GetKind() const = 0; Token(unsigned int position, unsigned int length) : _position(position), _length(length) { } inline const unsigned int GetStartPosition() const { return _position; } inline const unsigned int GetEndPosition() const { return _position + _length - 1; } inline const unsigned int GetLength() const { return _length; } virtual ~Token() = default; }; class SimpleToken : public Token { const TokenKind _kind; public: explicit SimpleToken(TokenKind kind, unsigned int position, unsigned int length) : Token(position, length), _kind(kind) { } inline const TokenKind GetKind() const final { return _kind; } }; class IntegerToken : public Token { const long _value; public: explicit IntegerToken(long value, unsigned int position, unsigned int length) : Token(position, length), _value(value) { } inline const TokenKind GetKind() const final { return TokenKind::Integer; } inline const long GetValue() const { return _value; } }; class FloatToken : public Token { const double _value; public: explicit FloatToken(double value, unsigned int position, unsigned int length) : Token(position, length), _value(value) { } inline const TokenKind GetKind() const final { return TokenKind::Float; } inline const double GetValue() const { return _value; } }; class StringToken : public Token { const u16string _value; public: explicit StringToken(u16string value, unsigned int position, unsigned int length) : Token(position, length), _value(std::move(value)) { } inline const TokenKind GetKind() const final { return TokenKind::String; } inline const u16string &GetValue() const { return _value; } }; class IdentifierToken : public Token { const Utilities::HashedString _value; public: explicit IdentifierToken(const HashedString value, unsigned int position, unsigned int length) : Token(position, length), _value(value) { } inline const TokenKind GetKind() const final { return TokenKind::Identifier; } inline const HashedString GetValue() const { return _value; } }; } #endif //PORYGONLANG_TOKEN_HPP