#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 TwoArgumentStatement : Statement { void (* function)(Execute::Flags & flags, int argument1, int argument2); Value firstArgument; Value secondArgument; void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override; }; struct ThreeArgumentStatement : Statement { void (* function)(Execute::Flags & flags, 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); }; }