aboutsummaryrefslogtreecommitdiff
path: root/src/NXP/Classes
diff options
context:
space:
mode:
Diffstat (limited to 'src/NXP/Classes')
-rw-r--r--src/NXP/Classes/Calculator.php10
-rw-r--r--src/NXP/Classes/Lexer.php78
-rw-r--r--src/NXP/Classes/Token/AbstractContainerToken.php2
-rw-r--r--src/NXP/Classes/Token/AbstractOperator.php2
-rw-r--r--src/NXP/Classes/Token/InterfaceFunction.php2
-rw-r--r--src/NXP/Classes/Token/InterfaceOperator.php2
-rw-r--r--src/NXP/Classes/Token/InterfaceToken.php2
-rw-r--r--src/NXP/Classes/Token/TokenComma.php2
-rw-r--r--src/NXP/Classes/Token/TokenDegree.php2
-rw-r--r--src/NXP/Classes/Token/TokenDivision.php2
-rw-r--r--src/NXP/Classes/Token/TokenFunction.php2
-rw-r--r--src/NXP/Classes/Token/TokenLeftBracket.php2
-rw-r--r--src/NXP/Classes/Token/TokenMinus.php2
-rw-r--r--src/NXP/Classes/Token/TokenMultiply.php2
-rw-r--r--src/NXP/Classes/Token/TokenNumber.php2
-rw-r--r--src/NXP/Classes/Token/TokenPlus.php2
-rw-r--r--src/NXP/Classes/Token/TokenRightBracket.php2
-rw-r--r--src/NXP/Classes/Token/TokenStringDoubleQuoted.php (renamed from src/NXP/Classes/Token/TokenString.php)2
-rw-r--r--src/NXP/Classes/Token/TokenStringSingleQuoted.php26
-rw-r--r--src/NXP/Classes/Token/TokenVariable.php2
-rw-r--r--src/NXP/Classes/TokenFactory.php40
21 files changed, 113 insertions, 75 deletions
diff --git a/src/NXP/Classes/Calculator.php b/src/NXP/Classes/Calculator.php
index 253e70c..1ceac84 100644
--- a/src/NXP/Classes/Calculator.php
+++ b/src/NXP/Classes/Calculator.php
@@ -13,13 +13,14 @@ namespace NXP\Classes;
use NXP\Classes\Token\InterfaceOperator;
use NXP\Classes\Token\TokenFunction;
use NXP\Classes\Token\TokenNumber;
-use NXP\Classes\Token\TokenString;
+use NXP\Classes\Token\TokenStringSingleQuoted;
+use NXP\Classes\Token\TokenStringDoubleQuoted;
use NXP\Classes\Token\TokenVariable;
use NXP\Exception\IncorrectExpressionException;
use NXP\Exception\UnknownVariableException;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class Calculator
{
@@ -38,7 +39,10 @@ class Calculator
if ($token instanceof TokenNumber) {
array_push($stack, $token);
}
- if ($token instanceof TokenString) {
+ if ($token instanceof TokenStringDoubleQuoted) {
+ array_push($stack, $token);
+ }
+ if ($token instanceof TokenStringSingleQuoted) {
array_push($stack, $token);
}
if ($token instanceof TokenVariable) {
diff --git a/src/NXP/Classes/Lexer.php b/src/NXP/Classes/Lexer.php
index 1650b80..a511c9b 100644
--- a/src/NXP/Classes/Lexer.php
+++ b/src/NXP/Classes/Lexer.php
@@ -17,13 +17,14 @@ use NXP\Classes\Token\TokenFunction;
use NXP\Classes\Token\TokenLeftBracket;
use NXP\Classes\Token\TokenNumber;
use NXP\Classes\Token\TokenRightBracket;
+use NXP\Classes\Token\TokenStringSingleQuoted;
use NXP\Classes\Token\TokenVariable;
-use NXP\Classes\Token\TokenString;
+use NXP\Classes\Token\TokenStringDoubleQuoted;
use NXP\Exception\IncorrectBracketsException;
use NXP\Exception\IncorrectExpressionException;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class Lexer
{
@@ -38,9 +39,8 @@ class Lexer
}
/**
- * @param string $input Source string of equation
- * @return array Tokens stream
- * @throws \NXP\Exception\IncorrectExpressionException
+ * @param string $input Source string of equation
+ * @return array Tokens stream
*/
public function stringToTokensStream($input)
{
@@ -58,9 +58,9 @@ class Lexer
}
/**
- * @param array $tokensStream Tokens stream
- * @return array Array of tokens in revers polish notation
- * @throws \NXP\Exception\IncorrectExpressionException
+ * @param array $tokensStream Tokens stream
+ * @return array Array of tokens in revers polish notation
+ * @throws IncorrectBracketsException
*/
public function buildReversePolishNotation($tokensStream)
{
@@ -68,54 +68,50 @@ class Lexer
$stack = [];
foreach ($tokensStream as $token) {
- if ($token instanceof TokenString) {
+ if ($token instanceof TokenStringDoubleQuoted) {
$output[] = $token;
- }
- elseif ($token instanceof TokenNumber) {
+ } elseif ($token instanceof TokenStringSingleQuoted) {
$output[] = $token;
- }
- elseif ($token instanceof TokenVariable) {
+ } elseif ($token instanceof TokenNumber) {
$output[] = $token;
- }
- elseif ($token instanceof TokenFunction) {
+ } elseif ($token instanceof TokenVariable) {
+ $output[] = $token;
+ } elseif ($token instanceof TokenFunction) {
array_push($stack, $token);
- }
- elseif ($token instanceof AbstractOperator) {
+ } elseif ($token instanceof AbstractOperator) {
// While we have something on the stack
while (($count = count($stack)) > 0
- && (
- // If it is a function
- ($stack[$count-1] instanceof TokenFunction)
+ && (
+ // If it is a function
+ ($stack[$count - 1] instanceof TokenFunction)
- ||
- // Or the operator at the top of the operator stack
- // has (left associative and equal precedence)
- // or has greater precedence
- (($stack[$count-1] instanceof InterfaceOperator) &&
- (
- ($stack[$count-1]->getAssociation() == AbstractOperator::LEFT_ASSOC &&
- $token->getPriority() == $stack[$count-1]->getPriority())
- ||
- ($stack[$count-1]->getPriority() > $token->getPriority())
- )
- )
- )
+ ||
+ // Or the operator at the top of the operator stack
+ // has (left associative and equal precedence)
+ // or has greater precedence
+ (($stack[$count - 1] instanceof InterfaceOperator) &&
+ (
+ ($stack[$count - 1]->getAssociation() == AbstractOperator::LEFT_ASSOC &&
+ $token->getPriority() == $stack[$count - 1]->getPriority())
+ ||
+ ($stack[$count - 1]->getPriority() > $token->getPriority())
+ )
+ )
+ )
- // And not a left bracket
- && ( ! ($stack[$count-1] instanceof TokenLeftBracket)) ) {
+ // And not a left bracket
+ && (!($stack[$count - 1] instanceof TokenLeftBracket))) {
$output[] = array_pop($stack);
}
array_push($stack, $token);
- }
- elseif ($token instanceof TokenLeftBracket) {
+ } elseif ($token instanceof TokenLeftBracket) {
array_push($stack, $token);
- }
- elseif ($token instanceof TokenRightBracket) {
- while (($current = array_pop($stack)) && ( ! ($current instanceof TokenLeftBracket))) {
+ } elseif ($token instanceof TokenRightBracket) {
+ while (($current = array_pop($stack)) && (!($current instanceof TokenLeftBracket))) {
$output[] = $current;
}
- if (!empty($stack) && ($stack[count($stack)-1] instanceof TokenFunction)) {
+ if (!empty($stack) && ($stack[count($stack) - 1] instanceof TokenFunction)) {
$output[] = array_pop($stack);
}
}
diff --git a/src/NXP/Classes/Token/AbstractContainerToken.php b/src/NXP/Classes/Token/AbstractContainerToken.php
index 12d49d2..be2da5f 100644
--- a/src/NXP/Classes/Token/AbstractContainerToken.php
+++ b/src/NXP/Classes/Token/AbstractContainerToken.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
abstract class AbstractContainerToken implements InterfaceToken
{
diff --git a/src/NXP/Classes/Token/AbstractOperator.php b/src/NXP/Classes/Token/AbstractOperator.php
index 87634d5..8b23ad8 100644
--- a/src/NXP/Classes/Token/AbstractOperator.php
+++ b/src/NXP/Classes/Token/AbstractOperator.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
abstract class AbstractOperator implements InterfaceToken, InterfaceOperator
{
diff --git a/src/NXP/Classes/Token/InterfaceFunction.php b/src/NXP/Classes/Token/InterfaceFunction.php
index be867b0..a457d0e 100644
--- a/src/NXP/Classes/Token/InterfaceFunction.php
+++ b/src/NXP/Classes/Token/InterfaceFunction.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
interface InterfaceFunction
{
diff --git a/src/NXP/Classes/Token/InterfaceOperator.php b/src/NXP/Classes/Token/InterfaceOperator.php
index da6cdf0..9e3bae1 100644
--- a/src/NXP/Classes/Token/InterfaceOperator.php
+++ b/src/NXP/Classes/Token/InterfaceOperator.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
interface InterfaceOperator
{
diff --git a/src/NXP/Classes/Token/InterfaceToken.php b/src/NXP/Classes/Token/InterfaceToken.php
index 86fec91..db07aeb 100644
--- a/src/NXP/Classes/Token/InterfaceToken.php
+++ b/src/NXP/Classes/Token/InterfaceToken.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
interface InterfaceToken
{
diff --git a/src/NXP/Classes/Token/TokenComma.php b/src/NXP/Classes/Token/TokenComma.php
index f590e32..6a45595 100644
--- a/src/NXP/Classes/Token/TokenComma.php
+++ b/src/NXP/Classes/Token/TokenComma.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenComma implements InterfaceToken
{
diff --git a/src/NXP/Classes/Token/TokenDegree.php b/src/NXP/Classes/Token/TokenDegree.php
index 3eec23d..273183a 100644
--- a/src/NXP/Classes/Token/TokenDegree.php
+++ b/src/NXP/Classes/Token/TokenDegree.php
@@ -13,7 +13,7 @@ namespace NXP\Classes\Token;
use NXP\Exception\IncorrectExpressionException;
/**
-* @author Alexander Kiryukhin <alexander@symdev.org>
+* @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenDegree extends AbstractOperator
{
diff --git a/src/NXP/Classes/Token/TokenDivision.php b/src/NXP/Classes/Token/TokenDivision.php
index 9166d34..4a8f8ce 100644
--- a/src/NXP/Classes/Token/TokenDivision.php
+++ b/src/NXP/Classes/Token/TokenDivision.php
@@ -14,7 +14,7 @@ use NXP\Exception\IncorrectExpressionException;
use NXP\Exception\DivisionByZeroException;
/**
-* @author Alexander Kiryukhin <alexander@symdev.org>
+* @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenDivision extends AbstractOperator
{
diff --git a/src/NXP/Classes/Token/TokenFunction.php b/src/NXP/Classes/Token/TokenFunction.php
index 2ed8ace..b2866c3 100644
--- a/src/NXP/Classes/Token/TokenFunction.php
+++ b/src/NXP/Classes/Token/TokenFunction.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenFunction extends AbstractContainerToken implements InterfaceFunction
{
diff --git a/src/NXP/Classes/Token/TokenLeftBracket.php b/src/NXP/Classes/Token/TokenLeftBracket.php
index 0cfdc1a..08165d8 100644
--- a/src/NXP/Classes/Token/TokenLeftBracket.php
+++ b/src/NXP/Classes/Token/TokenLeftBracket.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenLeftBracket implements InterfaceToken
{
diff --git a/src/NXP/Classes/Token/TokenMinus.php b/src/NXP/Classes/Token/TokenMinus.php
index 566c950..ad0b8e5 100644
--- a/src/NXP/Classes/Token/TokenMinus.php
+++ b/src/NXP/Classes/Token/TokenMinus.php
@@ -13,7 +13,7 @@ namespace NXP\Classes\Token;
use NXP\Exception\IncorrectExpressionException;
/**
-* @author Alexander Kiryukhin <alexander@symdev.org>
+* @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenMinus extends AbstractOperator
{
diff --git a/src/NXP/Classes/Token/TokenMultiply.php b/src/NXP/Classes/Token/TokenMultiply.php
index 8b173b9..0b1ecfb 100644
--- a/src/NXP/Classes/Token/TokenMultiply.php
+++ b/src/NXP/Classes/Token/TokenMultiply.php
@@ -13,7 +13,7 @@ namespace NXP\Classes\Token;
use NXP\Exception\IncorrectExpressionException;
/**
-* @author Alexander Kiryukhin <alexander@symdev.org>
+* @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenMultiply extends AbstractOperator
{
diff --git a/src/NXP/Classes/Token/TokenNumber.php b/src/NXP/Classes/Token/TokenNumber.php
index a7eac57..982e316 100644
--- a/src/NXP/Classes/Token/TokenNumber.php
+++ b/src/NXP/Classes/Token/TokenNumber.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenNumber extends AbstractContainerToken
{
diff --git a/src/NXP/Classes/Token/TokenPlus.php b/src/NXP/Classes/Token/TokenPlus.php
index fe5a1d6..a6e5036 100644
--- a/src/NXP/Classes/Token/TokenPlus.php
+++ b/src/NXP/Classes/Token/TokenPlus.php
@@ -13,7 +13,7 @@ namespace NXP\Classes\Token;
use NXP\Exception\IncorrectExpressionException;
/**
-* @author Alexander Kiryukhin <alexander@symdev.org>
+* @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenPlus extends AbstractOperator
{
diff --git a/src/NXP/Classes/Token/TokenRightBracket.php b/src/NXP/Classes/Token/TokenRightBracket.php
index c68473a..306ae0b 100644
--- a/src/NXP/Classes/Token/TokenRightBracket.php
+++ b/src/NXP/Classes/Token/TokenRightBracket.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenRightBracket implements InterfaceToken
{
diff --git a/src/NXP/Classes/Token/TokenString.php b/src/NXP/Classes/Token/TokenStringDoubleQuoted.php
index cab0711..6cff262 100644
--- a/src/NXP/Classes/Token/TokenString.php
+++ b/src/NXP/Classes/Token/TokenStringDoubleQuoted.php
@@ -13,7 +13,7 @@ namespace NXP\Classes\Token;
/**
* @author Bruce Wells <brucekwells@gmail.com>
*/
-class TokenString extends AbstractContainerToken
+class TokenStringDoubleQuoted extends AbstractContainerToken
{
/**
* @return string
diff --git a/src/NXP/Classes/Token/TokenStringSingleQuoted.php b/src/NXP/Classes/Token/TokenStringSingleQuoted.php
new file mode 100644
index 0000000..7a7ab92
--- /dev/null
+++ b/src/NXP/Classes/Token/TokenStringSingleQuoted.php
@@ -0,0 +1,26 @@
+<?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\Token;
+
+/**
+ * @author Bruce Wells <brucekwells@gmail.com>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
+ */
+class TokenStringSingleQuoted extends AbstractContainerToken
+{
+ /**
+ * @return string
+ */
+ public static function getRegex()
+ {
+ return "'([^']|'')*'";
+ }
+}
diff --git a/src/NXP/Classes/Token/TokenVariable.php b/src/NXP/Classes/Token/TokenVariable.php
index ccd7c83..a4a820a 100644
--- a/src/NXP/Classes/Token/TokenVariable.php
+++ b/src/NXP/Classes/Token/TokenVariable.php
@@ -11,7 +11,7 @@
namespace NXP\Classes\Token;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenVariable extends AbstractContainerToken
{
diff --git a/src/NXP/Classes/TokenFactory.php b/src/NXP/Classes/TokenFactory.php
index 6956f31..74b5789 100644
--- a/src/NXP/Classes/TokenFactory.php
+++ b/src/NXP/Classes/TokenFactory.php
@@ -16,14 +16,15 @@ use NXP\Classes\Token\TokenFunction;
use NXP\Classes\Token\TokenLeftBracket;
use NXP\Classes\Token\TokenNumber;
use NXP\Classes\Token\TokenRightBracket;
+use NXP\Classes\Token\TokenStringSingleQuoted;
use NXP\Classes\Token\TokenVariable;
-use NXP\Classes\Token\TokenString;
+use NXP\Classes\Token\TokenStringDoubleQuoted;
use NXP\Exception\UnknownFunctionException;
use NXP\Exception\UnknownOperatorException;
use NXP\Exception\UnknownTokenException;
/**
- * @author Alexander Kiryukhin <alexander@symdev.org>
+ * @author Alexander Kiryukhin <a.kiryukhin@mail.ru>
*/
class TokenFactory
{
@@ -50,12 +51,17 @@ class TokenFactory
/**
* Add function
- * @param string $name
+ * @param string $name
* @param callable $function
- * @param int $places
+ * @param int $places
+ * @throws \ReflectionException
*/
- public function addFunction($name, callable $function, $places = 1)
+ public function addFunction($name, callable $function, $places = null)
{
+ if ($places === null) {
+ $reflector = new \ReflectionFunction($function);
+ $places = $reflector->getNumberOfParameters();
+ }
$this->functions[$name] = [$places, $function];
}
@@ -72,8 +78,9 @@ class TokenFactory
/**
* Add operator
- * @param string $operatorClass
- * @throws \NXP\Exception\UnknownOperatorException
+ * @param string $operatorClass
+ * @throws UnknownOperatorException
+ * @throws \ReflectionException
*/
public function addOperator($operatorClass)
{
@@ -83,8 +90,7 @@ class TokenFactory
throw new UnknownOperatorException($operatorClass);
}
- $this->operators[] = $operatorClass;
- $this->operators = array_unique($this->operators);
+ $this->operators[$operatorClass::getRegex()] = $operatorClass;
}
/**
@@ -131,9 +137,10 @@ class TokenFactory
}
return sprintf(
- '/(%s)|(%s)|([%s])|(%s)|(%s)|([%s%s%s])/i',
+ '/(%s)|(%s)|(%s)|([%s])|(%s)|(%s)|([%s%s%s])/i',
TokenNumber::getRegex(),
- TokenString::getRegex(),
+ TokenStringDoubleQuoted::getRegex(),
+ TokenStringSingleQuoted::getRegex(),
$operatorsRegex,
TokenFunction::getRegex(),
TokenVariable::getRegex(),
@@ -144,9 +151,10 @@ class TokenFactory
}
/**
- * @param string $token
+ * @param string $token
* @return InterfaceToken
* @throws UnknownTokenException
+ * @throws UnknownFunctionException
*/
public function createToken($token)
{
@@ -163,7 +171,11 @@ class TokenFactory
}
if ($token[0] == '"') {
- return new TokenString(str_replace('"', '', $token));
+ return new TokenStringDoubleQuoted(str_replace('"', '', $token));
+ }
+
+ if ($token[0] == "'") {
+ return new TokenStringSingleQuoted(str_replace("'", '', $token));
}
if ($token == ',') {
@@ -180,7 +192,7 @@ class TokenFactory
$regex = sprintf('/%s/i', TokenVariable::getRegex());
if (preg_match($regex, $token)) {
- return new TokenVariable(substr($token,1));
+ return new TokenVariable(substr($token, 1));
}
$regex = sprintf('/%s/i', TokenFunction::getRegex());