diff options
author | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2020-05-20 06:04:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-20 06:04:31 +0300 |
commit | 949334d6c37d384800c639ba9941e94f5157f5ac (patch) | |
tree | ecfbcc7e3033ef1f11c25baca1c9d32f496d8ee1 /src/NXP/Classes/CustomFunction.php | |
parent | 01415abc9d7f7401d9f4c09fbbec24930c65a097 (diff) |
WIP: New generation (#62)
* Massive refactoring
More clean structure
Parsing without regular expressions
* Cleanup unused imports
* Fix version string for Travis
* 7.1 downgrade
* Fix readme
Diffstat (limited to 'src/NXP/Classes/CustomFunction.php')
-rw-r--r-- | src/NXP/Classes/CustomFunction.php | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/NXP/Classes/CustomFunction.php b/src/NXP/Classes/CustomFunction.php new file mode 100644 index 0000000..944f7d9 --- /dev/null +++ b/src/NXP/Classes/CustomFunction.php @@ -0,0 +1,63 @@ +<?php + + +namespace NXP\Classes; + + +use NXP\Exception\IncorrectExpressionException; +use ReflectionException; +use ReflectionFunction; + +class CustomFunction +{ + /** + * @var string + */ + public $name; + + /** + * @var callable $function + */ + public $function; + + /** + * @var int + */ + public $places; + + /** + * CustomFunction constructor. + * @param string $name + * @param callable $function + * @param int $places + * @throws ReflectionException + */ + public function __construct(string $name, callable $function, $places = null) + { + $this->name = $name; + $this->function = $function; + if ($places === null) { + $reflection = new ReflectionFunction($function); + $this->places = $reflection->getNumberOfParameters(); + } else { + $this->places = $places; + } + } + + public function execute(&$stack) + { + if (count($stack) < $this->places) { + throw new IncorrectExpressionException(); + } + $args = []; + for ($i = 0; $i < $this->places; $i++) { + array_unshift($args, array_pop($stack)->value); + } + + $result = call_user_func_array($this->function, $args); + + return new Token(Token::Literal, $result); + } + + +}
\ No newline at end of file |