Files
wassembly/include/interpret/statement.hpp

102 lines
2.6 KiB
C++

#pragma once
#include <execute/flags.hpp>
#include <execute/registers.hpp>
#include <execute/state.hpp>
#include <interpret/value.hpp>
namespace Interpret
{
struct Statement
{
virtual void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) = 0;
};
struct NoArgumentStatement : Statement
{
void (* function)(Execute::Flags & flags, Execute::Registers & registers);
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct OneArgumentStatement : Statement
{
void (* function)(Execute::Flags & flags, int argument1);
Value firstArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct ControlFlowStatement : Statement
{
void (* function)(Execute::State & state, int argument1, int argument2);
Value firstArgument;
Value secondArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct ArithmeticStatement : Statement
{
void (* function)(int argument1, int argument2, int & argument3);
Value firstArgument;
Value secondArgument;
Value thirdArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct JumpStatement : Statement
{
private:
std::string const label;
public:
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
JumpStatement(std::string const & label);
};
struct FunctionCallStatement : Statement
{
private:
std::string const label;
public:
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
FunctionCallStatement(std::string const & label);
};
struct ReturnFromFunctionStatement : Statement
{
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct SetStatement : Statement
{
Value firstArgument;
Value secondArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct InterruptStatement : Statement
{
Value firstArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct PushStatement : Statement
{
Value firstArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct PopStatement : Statement
{
Value firstArgument;
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
}