#pragma once #include #include #include #include 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 ExitProgramStatement : 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; }; }