diff options
author | NeonXP <frei@neonxp.info> | 2013-09-06 05:42:09 +0400 |
---|---|---|
committer | NeonXP <frei@neonxp.info> | 2013-09-06 05:42:09 +0400 |
commit | 9cdc34290a84093b1c4640118289a7cf56d55125 (patch) | |
tree | 2187fa94cc9f152c9196e7bd4fe23a2c81f60ffd /src/NXP/Classes/Calculator.php | |
parent | f172123a0dccdca7651c7ad552175924a16b9458 (diff) |
Mass refactoring
Some changes:
+ Added support of functions with multiple arguments
+ Added some default function (min, max, avg). just example of multiple arguments :)
- Removed variables support (I think they pointless)
~ All tokens now in individual classes
~ Parsing based on regular expressions
~ Fix negative numbers
~ Fix grouping with brackets
Diffstat (limited to 'src/NXP/Classes/Calculator.php')
-rw-r--r-- | src/NXP/Classes/Calculator.php | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/NXP/Classes/Calculator.php b/src/NXP/Classes/Calculator.php new file mode 100644 index 0000000..e74b7ab --- /dev/null +++ b/src/NXP/Classes/Calculator.php @@ -0,0 +1,46 @@ +<?php +/** + * This file is part of the MathExecutor package + * + * (c) Alexander Kiryukhin + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code + */ + +namespace NXP\Classes; + +use NXP\Classes\Token\InterfaceOperator; +use NXP\Classes\Token\TokenFunction; +use NXP\Classes\Token\TokenNumber; +use NXP\Exception\IncorrectExpressionException; + +/** + * @author Alexander Kiryukhin <alexander@symdev.org> + */ +class Calculator +{ + /** + * @param array $tokens Tokens in reverse polish notation + * @return number + * @throws \NXP\Exception\IncorrectExpressionException + */ + public function calculate($tokens) + { + $stack = array(); + foreach ($tokens as $token) { + if ($token instanceof TokenNumber) { + array_push($stack, $token); + } + if ($token instanceof InterfaceOperator || $token instanceof TokenFunction) { + array_push($stack, $token->execute($stack)); + } + } + $result = array_pop($stack); + if (!empty($stack)) { + throw new IncorrectExpressionException(); + } + + return $result->getValue(); + } +} |