72 lines
1.9 KiB
C++
72 lines
1.9 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 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;
|
|
};
|
|
} |