Basic arithmetic and jump labels

This commit is contained in:
2019-11-17 21:02:35 +01:00
commit b84557b3e1
34 changed files with 1350 additions and 0 deletions

165
src/token/token.cpp Normal file
View File

@@ -0,0 +1,165 @@
#include <cstdio>
#include <token/token.hpp>
namespace Token
{
Token::Token(int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Unknown),
isValid(false)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, OperandType _operatorType, bool validness)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Operand),
isValid(validness),
data(_operatorType)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, RegisterType _registerType, bool validness)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Register),
isValid(validness),
data(_registerType)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, int value, bool validness)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::ImmediateInteger),
isValid(validness),
data(value)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, std::string const & value, bool validness)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Label),
isValid(validness),
data(value)
{
}
Token::Token(Token const & other)
: lineNumber(other.lineNumber),
lineColumn(other.lineColumn),
type(other.type),
isValid(other.isValid),
data(other.data)
{
}
void Token::DebugPrint() const
{
std::putc(' ', stdout);
switch(type)
{
case TokenType::ImmediateInteger:
if (isValid)
{
std::printf("$int=%i", std::get<int>(data));
}
else
{
std::printf("BAD_IMM_INT");
}
break;
case TokenType::Operand:
if (isValid)
{
switch(std::get<OperandType>(data))
{
case OperandType::AddInteger:
std::printf("addi");
break;
case OperandType::MultiplyInteger:
std::printf("muli");
break;
case OperandType::SubtractInteger:
std::printf("subi");
break;
case OperandType::DivideInteger:
std::printf("divi");
break;
case OperandType::ShiftIntegerLeft:
std::printf("shli");
break;
case OperandType::ShiftIntegerRight:
std::printf("shri");
break;
case OperandType::Jump:
std::printf("jump");
break;
default:
std::printf("unknown_op");
break;
}
}
else
{
std::printf("BAD_OP");
}
break;
case TokenType::Register:
if (isValid)
{
switch(std::get<RegisterType>(data))
{
case RegisterType::A:
std::printf("%%A");
break;
case RegisterType::B:
std::printf("%%B");
break;
case RegisterType::C:
std::printf("%%C");
break;
case RegisterType::D:
std::printf("%%D");
break;
default:
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::Unknown:
default:
std::printf("UNKNOWN_TOKEN");
break;
}
}
}