aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/NXP/Classes/Calculator.php12
-rw-r--r--src/NXP/Classes/Lexer.php9
-rw-r--r--src/NXP/Classes/Token/TokenComma.php30
-rw-r--r--src/NXP/Classes/Token/TokenFunction.php5
4 files changed, 42 insertions, 14 deletions
diff --git a/src/NXP/Classes/Calculator.php b/src/NXP/Classes/Calculator.php
index 62dbc17..980a52b 100644
--- a/src/NXP/Classes/Calculator.php
+++ b/src/NXP/Classes/Calculator.php
@@ -36,21 +36,17 @@ class Calculator
{
$stack = [];
foreach ($tokens as $token) {
- if ($token instanceof TokenNumber) {
- array_push($stack, $token);
- } else if ($token instanceof TokenStringDoubleQuoted) {
- array_push($stack, $token);
- } else if ($token instanceof TokenStringSingleQuoted) {
- array_push($stack, $token);
+ 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));
+ $stack[] = new TokenNumber($value);
} else if ($token instanceof InterfaceOperator || $token instanceof TokenFunction) {
- array_push($stack, $token->execute($stack));
+ $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 04eae30..432f107 100644
--- a/src/NXP/Classes/Token/TokenFunction.php
+++ b/src/NXP/Classes/Token/TokenFunction.php
@@ -32,9 +32,10 @@ class TokenFunction extends AbstractContainerToken implements InterfaceFunction
$args = [];
list($places, $function) = $this->value;
for ($i = 0; $i < $places; $i++) {
- $args[] = array_pop($stack)->getValue();
+ array_unshift($args, array_pop($stack)->getValue());
}
- $result = call_user_func_array($function, array_reverse($args));
+
+ $result = call_user_func_array($function, $args);
return new TokenNumber($result);
}