aboutsummaryrefslogtreecommitdiff
path: root/src/NXP/Classes/Calculator.php
diff options
context:
space:
mode:
authorNeonXP <frei@neonxp.info>2013-09-06 05:42:09 +0400
committerNeonXP <frei@neonxp.info>2013-09-06 05:42:09 +0400
commit9cdc34290a84093b1c4640118289a7cf56d55125 (patch)
tree2187fa94cc9f152c9196e7bd4fe23a2c81f60ffd /src/NXP/Classes/Calculator.php
parentf172123a0dccdca7651c7ad552175924a16b9458 (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.php46
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();
+ }
+}