#pragma once #include #include #include #include namespace Token { enum class TokenValueType { None = 0, Integer, Operand, Register, String }; struct Token { private: Token(TokenType type, bool validness, int const lineNumber, int const lineColumn); Token(TokenType type, std::string const & string, bool validness, int const lineNumber, int const lineColumn); Token(TokenType type, int value, bool validness, int const lineNumber, int const lineColumn); Token(TokenType type, RegisterType const registerType, bool validness, int const lineNumber, int const lineColumn); Token(TokenType type, OperandType const OperandType, bool validness, int const lineNumber, int const lineColumn); public: int const lineNumber; int const lineColumn; TokenType type; TokenValueType const valueType; bool isValid; std::variant data; Token(Token const & other); static Token CreateUnknownToken(int const lineNumber, int const lineColumn); static Token CreateStatementEndToken(int const lineNumber, int const lineColumn); static Token CreateLabelToken(std::string const & string, bool isValid, int const lineNumber, int const lineColumn); static Token CreateImmediateValueToken(int const value, bool isValid, int const lineNumber, int const lineColumn); static Token CreateRegisterToken(RegisterType const registerType, int const lineNumber, int const lineColumn); static Token CreateOperandToken(OperandType const operandType, int const lineNumber, int const lineColumn); static Token CreateMemoryToken(RegisterType const registerType, int const lineNumber, int const lineColumn); static Token CreateMemoryToken(int const value, bool isValid, int const lineNumber, int const lineColumn); static Token CreateStringLiteralToken(std::string const & value, int const lineNumber, int const lineColumn); void DebugPrint() const; }; }