diff options
author | Bruce Wells <brucekwells@gmail.com> | 2020-05-20 04:37:04 +0300 |
---|---|---|
committer | Bruce Wells <brucekwells@gmail.com> | 2020-05-20 04:37:04 +0300 |
commit | 906021d27c4630328f68eb635a616774ab1b80e9 (patch) | |
tree | ecfbcc7e3033ef1f11c25baca1c9d32f496d8ee1 /src/NXP/Classes/Operator.php | |
parent | f284316053cbd7cde8e5209585a9f974ef2321e7 (diff) | |
parent | 11ea95cb2125e329a84b30f05e25a79e29abf353 (diff) |
Merge branch 'ng' of https://github.com/neonxp/MathExecutor into neonxp-ng
# Conflicts:
# src/NXP/Classes/Calculator.php
# src/NXP/Classes/Lexer.php
# src/NXP/Classes/Token/AbstractOperator.php
# src/NXP/Classes/TokenFactory.php
# src/NXP/MathExecutor.php
Diffstat (limited to 'src/NXP/Classes/Operator.php')
-rw-r--r-- | src/NXP/Classes/Operator.php | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/NXP/Classes/Operator.php b/src/NXP/Classes/Operator.php new file mode 100644 index 0000000..53550a9 --- /dev/null +++ b/src/NXP/Classes/Operator.php @@ -0,0 +1,69 @@ +<?php + + +namespace NXP\Classes; + + +use NXP\Exception\IncorrectExpressionException; +use ReflectionFunction; + +class Operator +{ + /** + * @var string + */ + public $operator; + + /** + * @var bool + */ + public $isRightAssoc; + + /** + * @var int + */ + public $priority; + + /** + * @var callable<\SplStack> + */ + public $function; + + /** + * @var int + */ + public $places; + + /** + * Operator constructor. + * @param string $operator + * @param bool $isRightAssoc + * @param int $priority + * @param callable $function + */ + public function __construct(string $operator, bool $isRightAssoc, int $priority, callable $function) + { + $this->operator = $operator; + $this->isRightAssoc = $isRightAssoc; + $this->priority = $priority; + $this->function = $function; + $this->function = $function; + $reflection = new ReflectionFunction($function); + $this->places = $reflection->getNumberOfParameters(); + } + + 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 |