Merge pull request #28 from phpfui/support_for_double_quoted_strings

Support for double quoted strings
This commit is contained in:
Alexander Kiryukhin 2018-09-12 20:05:09 +03:00 committed by GitHub
commit 4a672cfd94
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 111 additions and 57 deletions

View file

@ -13,6 +13,7 @@ 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\TokenVariable;
use NXP\Exception\IncorrectExpressionException;
use NXP\Exception\UnknownVariableException;
@ -32,11 +33,14 @@ class Calculator
*/
public function calculate($tokens, $variables)
{
$stack = array();
$stack = [];
foreach ($tokens as $token) {
if ($token instanceof TokenNumber) {
array_push($stack, $token);
}
if ($token instanceof TokenString) {
array_push($stack, $token);
}
if ($token instanceof TokenVariable) {
$variable = $token->getValue();
if (!array_key_exists($variable, $variables)) {

View file

@ -17,6 +17,7 @@ use NXP\Classes\Token\TokenLeftBracket;
use NXP\Classes\Token\TokenNumber;
use NXP\Classes\Token\TokenRightBracket;
use NXP\Classes\Token\TokenVariable;
use NXP\Classes\Token\TokenString;
use NXP\Exception\IncorrectBracketsException;
use NXP\Exception\IncorrectExpressionException;
@ -42,7 +43,7 @@ class Lexer
*/
public function stringToTokensStream($input)
{
$matches = array();
$matches = [];
preg_match_all($this->tokenFactory->getTokenParserRegex(), $input, $matches);
$tokenFactory = $this->tokenFactory;
$tokensStream = array_map(
@ -62,10 +63,13 @@ class Lexer
*/
public function buildReversePolishNotation($tokensStream)
{
$output = array();
$stack = array();
$output = [];
$stack = [];
foreach ($tokensStream as $token) {
if ($token instanceof TokenString) {
$output[] = $token;
}
if ($token instanceof TokenNumber) {
$output[] = $token;
}

View file

@ -29,7 +29,7 @@ class TokenFunction extends AbstractContainerToken implements InterfaceFunction
*/
public function execute(&$stack)
{
$args = array();
$args = [];
list($places, $function) = $this->value;
for ($i = 0; $i < $places; $i++) {
array_push($args, array_pop($stack)->getValue());

View file

@ -0,0 +1,25 @@
<?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>
*/
class TokenString extends AbstractContainerToken
{
/**
* @return string
*/
public static function getRegex()
{
return '"([^"]|"")*"';
}
}

View file

@ -17,6 +17,7 @@ use NXP\Classes\Token\TokenLeftBracket;
use NXP\Classes\Token\TokenNumber;
use NXP\Classes\Token\TokenRightBracket;
use NXP\Classes\Token\TokenVariable;
use NXP\Classes\Token\TokenString;
use NXP\Exception\UnknownFunctionException;
use NXP\Exception\UnknownOperatorException;
use NXP\Exception\UnknownTokenException;
@ -31,27 +32,26 @@ class TokenFactory
*
* @var array
*/
protected $operators = array();
protected $operators = [];
/**
* Available functions
*
* @var array
*/
protected $functions = array();
protected $functions = [];
/**
* Add function
* @param $name
* @param $function
* @param $places
* @param string $name
* @param callable $function
* @param int $places
*/
public function addFunction($name, $function, $places = 1)
public function addFunction($name, callable $function, $places = 1)
{
$this->functions[$name] = array($places, $function);
$this->functions[$name] = [$places, $function];
}
/**
* get functions
*
@ -90,16 +90,6 @@ class TokenFactory
return $this->operators;
}
/**
* Add variable
* @param string $name
* @param mixed $value
*/
public function addVariable($name, $value)
{
}
/**
* @return string
*/
@ -111,8 +101,9 @@ class TokenFactory
}
return sprintf(
'/(%s)|([%s])|(%s)|(%s)|([%s%s%s])/i',
'/(%s)|(%s)|([%s])|(%s)|(%s)|([%s%s%s])/i',
TokenNumber::getRegex(),
TokenString::getRegex(),
$operatorsRegex,
TokenFunction::getRegex(),
TokenVariable::getRegex(),
@ -141,6 +132,10 @@ class TokenFactory
return new TokenRightBracket();
}
if ($token[0] == '"') {
return new TokenString(str_replace('"', '', $token));
}
if ($token == ',') {
return new TokenComma();
}

View file

@ -14,6 +14,6 @@ namespace NXP\Exception;
/**
* @author Alexander Kiryukhin <alexander@symdev.org>
*/
class IncorrectBracketsException extends \Exception
class IncorrectBracketsException extends MathExecutorException
{
}

View file

@ -14,6 +14,6 @@ namespace NXP\Exception;
/**
* @author Vitaliy Zhuk <zhuk2205@gmail.com>
*/
class IncorrectExpressionException extends \Exception
class IncorrectExpressionException extends MathExecutorException
{
}

View file

@ -14,6 +14,6 @@ namespace NXP\Exception;
/**
* @author Vitaliy Zhuk <zhuk2205@gmail.com>
*/
class UnknownFunctionException extends \Exception
class UnknownFunctionException extends MathExecutorException
{
}

View file

@ -14,6 +14,6 @@ namespace NXP\Exception;
/**
* @author Vitaliy Zhuk <zhuk2205@gmail.com>
*/
class UnknownOperatorException extends \Exception
class UnknownOperatorException extends MathExecutorException
{
}

View file

@ -14,6 +14,6 @@ namespace NXP\Exception;
/**
* @author Vitaliy Zhuk <zhuk2205@gmail.com>
*/
class UnknownTokenException extends \Exception
class UnknownTokenException extends MathExecutorException
{
}

View file

@ -14,6 +14,6 @@ namespace NXP\Exception;
/**
* @author Alexander Kiryukhin <alexander@symdev.org>
*/
class UnknownVariableException extends \Exception
class UnknownVariableException extends MathExecutorException
{
}

View file

@ -15,6 +15,7 @@ use NXP\Classes\Calculator;
use NXP\Classes\Lexer;
use NXP\Classes\Token;
use NXP\Classes\TokenFactory;
use NXP\Exception\UnknownVariableException;
/**
* Class MathExecutor
@ -27,7 +28,7 @@ class MathExecutor
*
* @var array
*/
private $variables = array();
private $variables = [];
/**
* @var TokenFactory
@ -37,7 +38,7 @@ class MathExecutor
/**
* @var array
*/
private $cache = array();
private $cache = [];
/**
* Base math operators
@ -75,10 +76,36 @@ class MathExecutor
$this->tokenFactory->addFunction('max', 'max', 2);
$this->tokenFactory->addFunction('avg', function($arg1, $arg2) { return ($arg1 + $arg2) / 2; }, 2);
$this->setVars(array(
$this->setVars([
'pi' => 3.14159265359,
'e' => 2.71828182846
));
]);
}
/**
* Get all vars
*
* @return array
*/
public function getVars()
{
return $this->variables;
}
/**
* Get a specific var
*
* @param string $variable
* @return integer|float
* @throws UnknownVariableException
*/
public function getVar($variable)
{
if (! isset($this->variables[$variable])) {
throw new UnknownVariableException("Variable ({$variable}) not set");
}
return $this->variables[$variable];
}
/**
@ -86,7 +113,6 @@ class MathExecutor
*
* @param string $variable
* @param integer|float $value
* @throws \Exception
* @return MathExecutor
*/
public function setVar($variable, $value)
@ -138,7 +164,7 @@ class MathExecutor
*/
public function removeVars()
{
$this->variables = array();
$this->variables = [];
return $this;
}

View file

@ -27,7 +27,7 @@ class MathTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($calculator->execute($expression), $phpResult);
}
public function testZeroDevision()
public function testZeroDivision()
{
$calculator = new MathExecutor();
$this->assertEquals($calculator->execute('1 / 0'), 0);
@ -44,35 +44,35 @@ class MathTest extends \PHPUnit_Framework_TestCase
*/
public function providerExpressions()
{
return array(
array('0.1 + 0.2'),
array('1 + 2'),
return [
['0.1 + 0.2'],
['1 + 2'],
array('0.1 - 0.2'),
array('1 - 2'),
['0.1 - 0.2'],
['1 - 2'],
array('0.1 * 2'),
array('1 * 2'),
['0.1 * 2'],
['1 * 2'],
array('0.1 / 0.2'),
array('1 / 2'),
['0.1 / 0.2'],
['1 / 2'],
array('2 * 2 + 3 * 3'),
['2 * 2 + 3 * 3'],
array('1 + 0.6 - 3 * 2 / 50'),
['1 + 0.6 - 3 * 2 / 50'],
array('(5 + 3) * -1'),
['(5 + 3) * -1'],
array('2+2*2'),
array('(2+2)*2'),
array('(2+2)*-2'),
array('(2+-2)*2'),
['2+2*2'],
['(2+2)*2'],
['(2+2)*-2'],
['(2+-2)*2'],
array('sin(10) * cos(50) / min(10, 20/2)'),
['sin(10) * cos(50) / min(10, 20/2)'],
array('100500 * 3.5E5'),
array('100500 * 3.5E-5')
);
['100500 * 3.5E5'],
['100500 * 3.5E-5'],
];
}
public function testFunction()