Added base files, with the basic ability to add/remove variables from the Runtime.
This commit is contained in:
parent
aef02c4bff
commit
7e5207c45a
19 changed files with 906 additions and 0 deletions
14
Makefile
Normal file
14
Makefile
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
debug:
|
||||||
|
ncc build --config="debug"
|
||||||
|
|
||||||
|
release:
|
||||||
|
ncc build --config="release"
|
||||||
|
|
||||||
|
install:
|
||||||
|
ncc package install --package="build/release/net.nosial.rtex.ncc" --skip-dependencies --reinstall -y
|
||||||
|
|
||||||
|
install-debug:
|
||||||
|
ncc package install --package="build/debug/net.nosial.rtex.ncc" --skip-dependencies --reinstall -y
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
ncc package uninstall -y --package="net.nosial.rtex"
|
6
instructions/get_var.json
Normal file
6
instructions/get_var.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"type": "get",
|
||||||
|
"_": {
|
||||||
|
"variable": "foo"
|
||||||
|
}
|
||||||
|
}
|
7
instructions/set_var.json
Normal file
7
instructions/set_var.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"type": "set",
|
||||||
|
"_": {
|
||||||
|
"variable": "foo",
|
||||||
|
"value": "bar"
|
||||||
|
}
|
||||||
|
}
|
10
src/RTEX/Abstracts/InstructionType.php
Normal file
10
src/RTEX/Abstracts/InstructionType.php
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Abstracts;
|
||||||
|
|
||||||
|
abstract class InstructionType
|
||||||
|
{
|
||||||
|
const Invoke = 'invoke';
|
||||||
|
const GetVariable = 'get';
|
||||||
|
const SetVariable = 'set';
|
||||||
|
}
|
30
src/RTEX/Abstracts/VariableTypes.php
Normal file
30
src/RTEX/Abstracts/VariableTypes.php
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Abstracts;
|
||||||
|
|
||||||
|
abstract class VariableTypes
|
||||||
|
{
|
||||||
|
const String = 'string';
|
||||||
|
|
||||||
|
const Integer = 'integer';
|
||||||
|
|
||||||
|
const Float = 'float';
|
||||||
|
|
||||||
|
const Boolean = 'boolean';
|
||||||
|
|
||||||
|
const Null = 'null';
|
||||||
|
|
||||||
|
const Instruction = 'instruction';
|
||||||
|
|
||||||
|
const InstructionList = 'i_instruction';
|
||||||
|
|
||||||
|
const All = [
|
||||||
|
self::String,
|
||||||
|
self::Integer,
|
||||||
|
self::Float,
|
||||||
|
self::Boolean,
|
||||||
|
self::Null,
|
||||||
|
self::Instruction,
|
||||||
|
self::InstructionList
|
||||||
|
];
|
||||||
|
}
|
43
src/RTEX/Classes/InstructionBuilder.php
Normal file
43
src/RTEX/Classes/InstructionBuilder.php
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Classes;
|
||||||
|
|
||||||
|
use RTEX\Exceptions\Core\UnsupportedVariableType;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
use RTEX\Objects\Program\Instructions\GetVariable;
|
||||||
|
use RTEX\Objects\Program\Instructions\SetVariable;
|
||||||
|
|
||||||
|
class InstructionBuilder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructs a new get variable instruction
|
||||||
|
*
|
||||||
|
* @param $name
|
||||||
|
* @return InstructionInterface
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function getVariable($name): InstructionInterface
|
||||||
|
{
|
||||||
|
$instruction = new GetVariable();
|
||||||
|
$instruction->setVariable($name);
|
||||||
|
|
||||||
|
return $instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new set variable instruction
|
||||||
|
*
|
||||||
|
* @param $name
|
||||||
|
* @param $value
|
||||||
|
* @return InstructionInterface
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function setVariable($name, $value): InstructionInterface
|
||||||
|
{
|
||||||
|
$instruction = new SetVariable();
|
||||||
|
$instruction->setVariable($name);
|
||||||
|
$instruction->setValue($value);
|
||||||
|
|
||||||
|
return $instruction;
|
||||||
|
}
|
||||||
|
}
|
81
src/RTEX/Classes/Utilities.php
Normal file
81
src/RTEX/Classes/Utilities.php
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Classes;
|
||||||
|
|
||||||
|
use RTEX\Abstracts\InstructionType;
|
||||||
|
use RTEX\Abstracts\VariableTypes;
|
||||||
|
use RTEX\Exceptions\Core\MalformedInstructionException;
|
||||||
|
use RTEX\Exceptions\Core\UnsupportedVariableType;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
use RTEX\Objects\Program\Instructions\GetVariable;
|
||||||
|
use RTEX\Objects\Program\Instructions\SetVariable;
|
||||||
|
|
||||||
|
class Utilities
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determines the type of variable, throws an exception if the type is not supported
|
||||||
|
*
|
||||||
|
* @param $input
|
||||||
|
* @return string
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function determineType($input): string
|
||||||
|
{
|
||||||
|
if ($input instanceof InstructionInterface)
|
||||||
|
return VariableTypes::Instruction;
|
||||||
|
if (is_string($input))
|
||||||
|
return VariableTypes::String;
|
||||||
|
if (is_int($input))
|
||||||
|
return VariableTypes::Integer;
|
||||||
|
if (is_float($input))
|
||||||
|
return VariableTypes::Float;
|
||||||
|
if (is_bool($input))
|
||||||
|
return VariableTypes::Boolean;
|
||||||
|
if (is_null($input))
|
||||||
|
return VariableTypes::Null;
|
||||||
|
|
||||||
|
throw new UnsupportedVariableType(gettype($input));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a supported variable type to an array representation
|
||||||
|
*
|
||||||
|
* @param $input
|
||||||
|
* @return array|mixed
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function toArray($input)
|
||||||
|
{
|
||||||
|
return match (self::determineType($input))
|
||||||
|
{
|
||||||
|
VariableTypes::Instruction => $input->toArray(),
|
||||||
|
default => $input,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an instruction from an array representation
|
||||||
|
*
|
||||||
|
* @param array $array
|
||||||
|
* @return InstructionInterface
|
||||||
|
* @throws MalformedInstructionException
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function constructInstruction(array $array): InstructionInterface
|
||||||
|
{
|
||||||
|
if(!isset($array['type']))
|
||||||
|
throw new MalformedInstructionException(sprintf('Instruction type not specified'));
|
||||||
|
if(!isset($array['_']))
|
||||||
|
throw new MalformedInstructionException(sprintf('Instruction data not specified'));
|
||||||
|
|
||||||
|
switch($array['type'])
|
||||||
|
{
|
||||||
|
case InstructionType::GetVariable:
|
||||||
|
return GetVariable::fromArray($array['_']);
|
||||||
|
case InstructionType::SetVariable:
|
||||||
|
return SetVariable::fromArray($array['_']);
|
||||||
|
default:
|
||||||
|
throw new MalformedInstructionException(sprintf('Instruction type "%s" not supported', $array['type']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
src/RTEX/Classes/Validate.php
Normal file
31
src/RTEX/Classes/Validate.php
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Classes;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use RTEX\Abstracts\VariableTypes;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
|
||||||
|
class Validate
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determines if the input is a supported variable type
|
||||||
|
*
|
||||||
|
* @param $type
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function supportedVariableType($type): bool
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Utilities::determineType($type);
|
||||||
|
}
|
||||||
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
unset($e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
89
src/RTEX/Engine.php
Normal file
89
src/RTEX/Engine.php
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX;
|
||||||
|
|
||||||
|
use LogLib\Log;
|
||||||
|
use RTEX\Abstracts\VariableTypes;
|
||||||
|
use RTEX\Classes\Utilities;
|
||||||
|
use RTEX\Exceptions\Core\UnsupportedVariableType;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
use RTEX\Objects\Environment;
|
||||||
|
use RTEX\Objects\Program;
|
||||||
|
|
||||||
|
class Engine
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Program
|
||||||
|
*/
|
||||||
|
private $Program;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Environment
|
||||||
|
*/
|
||||||
|
private $Environment;
|
||||||
|
|
||||||
|
public function __construct(Program $program)
|
||||||
|
{
|
||||||
|
$this->Program = $program;
|
||||||
|
$this->Environment = new Environment();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the program by running the main script of the program
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
foreach($this->Program->getMain()->getInstructions() as $instruction)
|
||||||
|
{
|
||||||
|
$this->eval($instruction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates the variable or instruction and returns the result
|
||||||
|
*
|
||||||
|
* @param $input
|
||||||
|
* @return mixed
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
* @noinspection PhpMissingReturnTypeInspection
|
||||||
|
*/
|
||||||
|
public function eval($input)
|
||||||
|
{
|
||||||
|
switch(Utilities::determineType($input))
|
||||||
|
{
|
||||||
|
case VariableTypes::Instruction:
|
||||||
|
/** @var InstructionInterface $input */
|
||||||
|
return $input->eval($this);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return $input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Program
|
||||||
|
*/
|
||||||
|
public function getProgram(): Program
|
||||||
|
{
|
||||||
|
return $this->Program;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Program $Program
|
||||||
|
*/
|
||||||
|
public function setProgram(Program $Program): void
|
||||||
|
{
|
||||||
|
$this->Program = $Program;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Environment
|
||||||
|
*/
|
||||||
|
public function getEnvironment(): Environment
|
||||||
|
{
|
||||||
|
return $this->Environment;
|
||||||
|
}
|
||||||
|
}
|
16
src/RTEX/Exceptions/Core/MalformedInstructionException.php
Normal file
16
src/RTEX/Exceptions/Core/MalformedInstructionException.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Exceptions\Core;
|
||||||
|
|
||||||
|
class MalformedInstructionException extends \Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* MalformedInstructionException constructor.
|
||||||
|
*
|
||||||
|
* @param string $message
|
||||||
|
*/
|
||||||
|
public function __construct(string $message)
|
||||||
|
{
|
||||||
|
parent::__construct($message);
|
||||||
|
}
|
||||||
|
}
|
16
src/RTEX/Exceptions/Core/UnsupportedInstructionException.php
Normal file
16
src/RTEX/Exceptions/Core/UnsupportedInstructionException.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Exceptions\Core;
|
||||||
|
|
||||||
|
class UnsupportedInstructionException extends \Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* UnsupportedInstructionException constructor.
|
||||||
|
*
|
||||||
|
* @param string $message
|
||||||
|
*/
|
||||||
|
public function __construct(string $message)
|
||||||
|
{
|
||||||
|
parent::__construct($message);
|
||||||
|
}
|
||||||
|
}
|
13
src/RTEX/Exceptions/Core/UnsupportedVariableType.php
Normal file
13
src/RTEX/Exceptions/Core/UnsupportedVariableType.php
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Exceptions\Core;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class UnsupportedVariableType extends Exception
|
||||||
|
{
|
||||||
|
public function __construct($type)
|
||||||
|
{
|
||||||
|
parent::__construct("Unsupported variable type: $type");
|
||||||
|
}
|
||||||
|
}
|
40
src/RTEX/Interfaces/InstructionInterface.php
Normal file
40
src/RTEX/Interfaces/InstructionInterface.php
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Interfaces;
|
||||||
|
|
||||||
|
use RTEX\Abstracts\InstructionType;
|
||||||
|
use RTEX\Engine;
|
||||||
|
|
||||||
|
interface InstructionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns the type of instruction
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @see InstructionType
|
||||||
|
*/
|
||||||
|
public function getType(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array representation of the object
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new instruction from an array representation
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return InstructionInterface
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): InstructionInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates the instruction and returns the result of the evaluation
|
||||||
|
*
|
||||||
|
* @param Engine $engine
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function eval(Engine $engine);
|
||||||
|
}
|
81
src/RTEX/Objects/Environment.php
Normal file
81
src/RTEX/Objects/Environment.php
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Objects;
|
||||||
|
|
||||||
|
use LogLib\Log;
|
||||||
|
|
||||||
|
class Environment
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $RuntimeVariables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->RuntimeVariables = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of the specified variable
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getRuntimeVariable(string $name)
|
||||||
|
{
|
||||||
|
Log::debug('net.nosial.rtex', $name);
|
||||||
|
return $this->RuntimeVariables[$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the specified variable
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @param mixed $value
|
||||||
|
*/
|
||||||
|
public function setRuntimeVariable(string $name, $value): void
|
||||||
|
{
|
||||||
|
Log::debug('net.nosial.rtex', $name);
|
||||||
|
$this->RuntimeVariables[$name] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the value of the specified variable
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function clearRuntimeVariables(): void
|
||||||
|
{
|
||||||
|
$this->RuntimeVariables = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array representation of the object
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'variables' => $this->RuntimeVariables
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new environment from an array representation
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return Environment
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): Environment
|
||||||
|
{
|
||||||
|
$environment = new Environment();
|
||||||
|
$environment->RuntimeVariables = $data['variables'];
|
||||||
|
|
||||||
|
return $environment;
|
||||||
|
}
|
||||||
|
}
|
79
src/RTEX/Objects/Program.php
Normal file
79
src/RTEX/Objects/Program.php
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Objects;
|
||||||
|
|
||||||
|
use RTEX\Objects\Program\Script;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The main script of the program to execute
|
||||||
|
*
|
||||||
|
* @var Script
|
||||||
|
*/
|
||||||
|
private $Main;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->Main = new Script();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array representation of the object
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'main' => $this->Main->toArray()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new program from an array representation
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return Program
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): Program
|
||||||
|
{
|
||||||
|
$program = new Program();
|
||||||
|
$program->Main = Script::fromArray($data['main']);
|
||||||
|
|
||||||
|
return $program;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Script
|
||||||
|
*/
|
||||||
|
public function getMain(): Script
|
||||||
|
{
|
||||||
|
return $this->Main;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the program to a file
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function save(string $path): void
|
||||||
|
{
|
||||||
|
file_put_contents($path, json_encode($this->toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a program from a file
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @return Program
|
||||||
|
*/
|
||||||
|
public static function load(string $path): Program
|
||||||
|
{
|
||||||
|
return self::fromArray(json_decode(file_get_contents($path), true));
|
||||||
|
}
|
||||||
|
}
|
94
src/RTEX/Objects/Program/Instructions/GetVariable.php
Normal file
94
src/RTEX/Objects/Program/Instructions/GetVariable.php
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Objects\Program\Instructions;
|
||||||
|
|
||||||
|
use RTEX\Abstracts\InstructionType;
|
||||||
|
use RTEX\Classes\Utilities;
|
||||||
|
use RTEX\Engine;
|
||||||
|
use RTEX\Exceptions\Core\UnsupportedVariableType;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
|
||||||
|
class GetVariable implements InstructionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the variable to select
|
||||||
|
*
|
||||||
|
* @var string|integer|boolean|float|null|InstructionInterface|InstructionInterface[]
|
||||||
|
*/
|
||||||
|
private $Variable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the type of instruction
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @see InstructionType
|
||||||
|
*/
|
||||||
|
public function getType(): string
|
||||||
|
{
|
||||||
|
return InstructionType::GetVariable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array representation of the object
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'type' => $this->getType(),
|
||||||
|
'_' => [
|
||||||
|
'variable' => Utilities::toArray($this->Variable)
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns
|
||||||
|
*
|
||||||
|
* @return bool|float|int|InstructionInterface|string|null
|
||||||
|
* @noinspection PhpMissingReturnTypeInspection
|
||||||
|
*/
|
||||||
|
public function getVariable()
|
||||||
|
{
|
||||||
|
return $this->Variable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool|float|int|InstructionInterface|string|null $variable
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public function setVariable($variable): void
|
||||||
|
{
|
||||||
|
switch(Utilities::determineType($variable))
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
$this->Variable = $variable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new GetVariable instruction from an array representation
|
||||||
|
*
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): InstructionInterface
|
||||||
|
{
|
||||||
|
$instruction = new GetVariable();
|
||||||
|
$instruction->setVariable($data['variable'] ?? null);
|
||||||
|
return $instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function eval(Engine $engine)
|
||||||
|
{
|
||||||
|
return $engine->getEnvironment()->getRuntimeVariable(
|
||||||
|
$engine->eval($this->Variable)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
116
src/RTEX/Objects/Program/Instructions/SetVariable.php
Normal file
116
src/RTEX/Objects/Program/Instructions/SetVariable.php
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<?php /** @noinspection PhpReturnDocTypeMismatchInspection */
|
||||||
|
|
||||||
|
namespace RTEX\Objects\Program\Instructions;
|
||||||
|
|
||||||
|
use RTEX\Abstracts\InstructionType;
|
||||||
|
use RTEX\Classes\Utilities;
|
||||||
|
use RTEX\Engine;
|
||||||
|
use RTEX\Exceptions\Core\UnsupportedVariableType;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
|
||||||
|
class SetVariable implements InstructionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the variable to set
|
||||||
|
*
|
||||||
|
* @var string|integer|boolean|float|null|InstructionInterface
|
||||||
|
*/
|
||||||
|
private $Variable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value to set the variable to
|
||||||
|
*
|
||||||
|
* @var string|integer|boolean|float|null|InstructionInterface
|
||||||
|
*/
|
||||||
|
private $Value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the variable to set
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getType(): string
|
||||||
|
{
|
||||||
|
return InstructionType::SetVariable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array representation of the object
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'type' => $this->getType(),
|
||||||
|
'_' => [
|
||||||
|
'variable' => Utilities::toArray($this->Variable),
|
||||||
|
'value' => Utilities::toArray($this->Value)
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): InstructionInterface
|
||||||
|
{
|
||||||
|
$instruction = new self();
|
||||||
|
$instruction->setVariable($data['variable'] ?? null);
|
||||||
|
$instruction->setValue($data['value'] ?? null);
|
||||||
|
|
||||||
|
return $instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool|float|int|InstructionInterface|InstructionInterface[]|string|null
|
||||||
|
*/
|
||||||
|
public function getVariable()
|
||||||
|
{
|
||||||
|
return $this->Variable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool|float|int|InstructionInterface|InstructionInterface|string|null $variable
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
* @noinspection PhpMissingParamTypeInspection
|
||||||
|
*/
|
||||||
|
public function setVariable($variable): void
|
||||||
|
{
|
||||||
|
Utilities::determineType($variable);
|
||||||
|
$this->Variable = $variable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool|float|int|InstructionInterface|InstructionInterface[]|string|null
|
||||||
|
*/
|
||||||
|
public function getValue()
|
||||||
|
{
|
||||||
|
return $this->Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool|float|int|InstructionInterface|InstructionInterface|string|null $value
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
* @noinspection PhpMissingParamTypeInspection
|
||||||
|
*/
|
||||||
|
public function setValue($value): void
|
||||||
|
{
|
||||||
|
Utilities::determineType($value);
|
||||||
|
$this->Value = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Engine $engine
|
||||||
|
* @return mixed|void
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public function eval(Engine $engine)
|
||||||
|
{
|
||||||
|
$engine->getEnvironment()->setRuntimeVariable(
|
||||||
|
$engine->eval($this->Variable),
|
||||||
|
$engine->eval($this->Value)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
133
src/RTEX/Objects/Program/Script.php
Normal file
133
src/RTEX/Objects/Program/Script.php
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX\Objects\Program;
|
||||||
|
|
||||||
|
use RTEX\Classes\Utilities;
|
||||||
|
use RTEX\Exceptions\Core\MalformedInstructionException;
|
||||||
|
use RTEX\Exceptions\Core\UnsupportedVariableType;
|
||||||
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
|
||||||
|
class Script
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* An array of instructions to execute in order
|
||||||
|
*
|
||||||
|
* @var InstructionInterface[]
|
||||||
|
*/
|
||||||
|
private $Instructions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->Instructions = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an instruction to the script and returns the index of the instruction
|
||||||
|
*
|
||||||
|
* @param InstructionInterface $instruction
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function addInstruction(InstructionInterface $instruction): int
|
||||||
|
{
|
||||||
|
return array_push($this->Instructions, $instruction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the instruction at the specified index
|
||||||
|
*
|
||||||
|
* @param int $index
|
||||||
|
* @return InstructionInterface
|
||||||
|
*/
|
||||||
|
public function getInstruction(int $index): InstructionInterface
|
||||||
|
{
|
||||||
|
return $this->Instructions[$index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of instructions in the script
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getInstructionCount(): int
|
||||||
|
{
|
||||||
|
return count($this->Instructions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the instruction at the specified index
|
||||||
|
*
|
||||||
|
* @param int $index
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleteInstruction(int $index): void
|
||||||
|
{
|
||||||
|
unset($this->Instructions[$index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the instruction at the specified index
|
||||||
|
*
|
||||||
|
* @param int $index
|
||||||
|
* @param InstructionInterface $instruction
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function replaceInstruction(int $index, InstructionInterface $instruction): void
|
||||||
|
{
|
||||||
|
$this->Instructions[$index] = $instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all instructions from the script
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function clear()
|
||||||
|
{
|
||||||
|
$this->Instructions = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array representation of the object
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
$instructions = [];
|
||||||
|
foreach ($this->Instructions as $instruction)
|
||||||
|
{
|
||||||
|
$instructions[] = $instruction->toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $instructions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a script from an array representation
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return Script
|
||||||
|
* @throws MalformedInstructionException
|
||||||
|
* @throws UnsupportedVariableType
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): Script
|
||||||
|
{
|
||||||
|
$script = new Script();
|
||||||
|
|
||||||
|
foreach ($data as $instruction)
|
||||||
|
$script->addInstruction(Utilities::constructInstruction($instruction));
|
||||||
|
|
||||||
|
return $script;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array|InstructionInterface[]
|
||||||
|
*/
|
||||||
|
public function getInstructions(): array
|
||||||
|
{
|
||||||
|
return $this->Instructions;
|
||||||
|
}
|
||||||
|
}
|
7
src/RTEX/RTEX.php
Normal file
7
src/RTEX/RTEX.php
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RTEX;
|
||||||
|
|
||||||
|
class RTEX
|
||||||
|
{
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue