107 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.8 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 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;
 | |
| 	};
 | |
| } |