Files
wassembly/include/token/token.hpp

50 lines
2.0 KiB
C++

#pragma once
#include <token/operandtype.hpp>
#include <token/registertype.hpp>
#include <token/tokentype.hpp>
#include <variant>
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<OperandType, RegisterType, int, std::string> 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;
};
}