Files
wassembly/src/token/token.cpp

215 lines
5.1 KiB
C++

#include <cstdio>
#include <token/token.hpp>
namespace Token
{
Token::Token(TokenType _type, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(_type),
valueType(TokenValueType::None),
isValid(validness),
data(0),
errorMessage()
{
}
Token::Token(TokenType _type, std::string const & string, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(_type),
valueType(TokenValueType::String),
isValid(validness),
data(string),
errorMessage()
{
}
Token::Token(TokenType _type, int value, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(_type),
valueType(TokenValueType::Integer),
isValid(validness),
data(value),
errorMessage()
{
}
Token::Token(TokenType _type, RegisterType const registerType, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(_type),
valueType(TokenValueType::Register),
isValid(validness),
data(registerType),
errorMessage()
{
}
Token::Token(TokenType _type, OperandType const operandType, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(_type),
valueType(TokenValueType::Operand),
isValid(validness),
data(operandType),
errorMessage()
{
}
Token::Token(Token const & other)
: lineNumber(other.lineNumber),
lineColumn(other.lineColumn),
type(other.type),
valueType(other.valueType),
isValid(other.isValid),
data(other.data),
errorMessage(other.errorMessage)
{
}
Token Token::CreateEmptyToken(int const lineNumber, int const lineColumn)
{
return Token(TokenType::Unknown, false, lineNumber, lineColumn);
}
Token Token::CreateErrorToken(std::string const & message, TokenType const type, int const lineNumber, int const lineColumn)
{
Token token(type, false, lineNumber, lineColumn);
token.errorMessage = message;
return token;
}
Token Token::CreateStatementEndToken(int const lineNumber, int const lineColumn)
{
return Token(TokenType::StatementEnd, true, lineNumber, lineColumn);
}
Token Token::CreateLabelToken(std::string const & string, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Label, string, true, lineNumber, lineColumn);
}
Token Token::CreateImmediateValueToken(int const value, int const lineNumber, int const lineColumn)
{
return Token(TokenType::ImmediateInteger, value, true, lineNumber, lineColumn);
}
Token Token::CreateRegisterToken(RegisterType const registerType, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Register, registerType, registerType != RegisterType::Unknown, lineNumber, lineColumn);
}
Token Token::CreateOperandToken(OperandType const operandType, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Operand, operandType, operandType != OperandType::Unknown, lineNumber, lineColumn);
}
Token Token::CreateMemoryToken(RegisterType const registerType, int const lineNumber, int const lineColumn)
{
if (registerType == RegisterType::Unknown)
{
return CreateErrorToken("Unknown register used", TokenType::Register, lineNumber, lineColumn);
}
return Token(TokenType::Memory, registerType, true, lineNumber, lineColumn);
}
Token Token::CreateMemoryToken(int const value, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Memory, value, true, lineNumber, lineColumn);
}
void Token::Print() const
{
std::putc(' ', stdout);
switch(type)
{
case TokenType::ImmediateInteger:
if (isValid)
{
std::printf("%i", std::get<int>(data));
}
else
{
std::printf("BAD_IMM");
}
break;
case TokenType::Operand:
if (isValid)
{
OperandType const opType = std::get<OperandType>(data);
switch(opType)
{
case OperandType::Unknown:
std::printf("unknown_op");
break;
default:
std::printf("op%i", static_cast<int>(opType));
break;
}
}
else
{
std::printf("BAD_OP");
}
break;
case TokenType::Register:
if (isValid)
{
RegisterType const regType = std::get<RegisterType>(data);
switch(regType)
{
default:
std::printf("%%%i", static_cast<int>(regType));
break;
case RegisterType::Unknown:
std::printf("%%unknown_reg");
break;
}
}
else
{
std::printf("BAD_REG");
}
break;
case TokenType::StatementEnd:
std::printf("EOS");
break;
case TokenType::Label:
std::printf("LABEL=%s", std::get<std::string>(data).c_str());
break;
case TokenType::Memory:
{
switch(valueType)
{
case TokenValueType::Integer:
std::printf("[$%i]", std::get<int>(data));
break;
case TokenValueType::Register:
std::printf("[%%%i]", static_cast<int>(std::get<RegisterType>(data)));
break;
default:
std::printf("[UNKNOWN_TYPE]");
break;
}
}
break;
case TokenType::Unknown:
default:
std::printf("UNKNOWN_TOKEN");
break;
}
}
}