diff options
author | Bruce Wells <bruce.wells@simparel.com> | 2019-08-16 15:35:06 +0300 |
---|---|---|
committer | Bruce Wells <bruce.wells@simparel.com> | 2019-08-16 15:35:06 +0300 |
commit | 2bc89df821e2b98577a1b8daa1fd7349b18dcf92 (patch) | |
tree | 50fad589e827aa2904c65b27a6f9cba759316458 /src/NXP | |
parent | e03df64281a1c33639b13c9f490d4452c1a1784d (diff) | |
parent | e1b770d6c884d79b8c3c6226d2e6cc8cc5a633ca (diff) |
Merge branch 'master' of https://github.com/phpfui/MathExecutor
# Conflicts:
# src/NXP/Classes/Token/TokenFunction.php
Diffstat (limited to 'src/NXP')
-rw-r--r-- | src/NXP/Classes/Calculator.php | 20 | ||||
-rw-r--r-- | src/NXP/Classes/Lexer.php | 9 | ||||
-rw-r--r-- | src/NXP/Classes/Token/TokenComma.php | 30 | ||||
-rw-r--r-- | src/NXP/Classes/Token/TokenFunction.php | 3 |
4 files changed, 43 insertions, 19 deletions
diff --git a/src/NXP/Classes/Calculator.php b/src/NXP/Classes/Calculator.php index 1ceac84..980a52b 100644 --- a/src/NXP/Classes/Calculator.php +++ b/src/NXP/Classes/Calculator.php @@ -36,25 +36,17 @@ class Calculator { $stack = []; foreach ($tokens as $token) { - if ($token instanceof TokenNumber) { - array_push($stack, $token); - } - if ($token instanceof TokenStringDoubleQuoted) { - array_push($stack, $token); - } - if ($token instanceof TokenStringSingleQuoted) { - array_push($stack, $token); - } - if ($token instanceof TokenVariable) { + if ($token instanceof TokenNumber || $token instanceof TokenStringDoubleQuoted || $token instanceof TokenStringSingleQuoted) { + $stack[] = $token; + } else if ($token instanceof TokenVariable) { $variable = $token->getValue(); if (!array_key_exists($variable, $variables)) { throw new UnknownVariableException($variable); } $value = $variables[$variable]; - array_push($stack, new TokenNumber($value)); - } - if ($token instanceof InterfaceOperator || $token instanceof TokenFunction) { - array_push($stack, $token->execute($stack)); + $stack[] = new TokenNumber($value); + } else if ($token instanceof InterfaceOperator || $token instanceof TokenFunction) { + $stack[] = $token->execute($stack); } } $result = array_pop($stack); diff --git a/src/NXP/Classes/Lexer.php b/src/NXP/Classes/Lexer.php index a511c9b..898d8c1 100644 --- a/src/NXP/Classes/Lexer.php +++ b/src/NXP/Classes/Lexer.php @@ -77,7 +77,7 @@ class Lexer } elseif ($token instanceof TokenVariable) { $output[] = $token; } elseif ($token instanceof TokenFunction) { - array_push($stack, $token); + $stack[] = $token; } elseif ($token instanceof AbstractOperator) { // While we have something on the stack while (($count = count($stack)) > 0 @@ -104,9 +104,12 @@ class Lexer $output[] = array_pop($stack); } - array_push($stack, $token); + // Comma operators do nothing really, don't put them on the stack + if (! ($token instanceof TokenComma)) { + $stack[] = $token; + } } elseif ($token instanceof TokenLeftBracket) { - array_push($stack, $token); + $stack[] = $token; } elseif ($token instanceof TokenRightBracket) { while (($current = array_pop($stack)) && (!($current instanceof TokenLeftBracket))) { $output[] = $current; diff --git a/src/NXP/Classes/Token/TokenComma.php b/src/NXP/Classes/Token/TokenComma.php index 6a45595..f6fc068 100644 --- a/src/NXP/Classes/Token/TokenComma.php +++ b/src/NXP/Classes/Token/TokenComma.php @@ -13,7 +13,7 @@ namespace NXP\Classes\Token; /** * @author Alexander Kiryukhin <a.kiryukhin@mail.ru> */ -class TokenComma implements InterfaceToken +class TokenComma extends AbstractOperator { /** * @return string @@ -22,4 +22,32 @@ class TokenComma implements InterfaceToken { return '\,'; } + + /** + * Comma operator is lowest priority + * + * @return int + */ + public function getPriority() + { + return 0; + } + + /** + * @return string + */ + public function getAssociation() + { + return self::LEFT_ASSOC; + } + + /** + * @param array $stack + * @return TokenNumber + */ + public function execute(&$stack) + { + // Comma operators don't do anything, stack has already executed + } + } diff --git a/src/NXP/Classes/Token/TokenFunction.php b/src/NXP/Classes/Token/TokenFunction.php index d61bb5d..432f107 100644 --- a/src/NXP/Classes/Token/TokenFunction.php +++ b/src/NXP/Classes/Token/TokenFunction.php @@ -32,8 +32,9 @@ class TokenFunction extends AbstractContainerToken implements InterfaceFunction $args = []; list($places, $function) = $this->value; for ($i = 0; $i < $places; $i++) { - $args[] = array_shift($stack)->getValue(); + array_unshift($args, array_pop($stack)->getValue()); } + $result = call_user_func_array($function, $args); return new TokenNumber($result); |