Support for unary positive expressions (#85)
* Support for unary positive operator
This commit is contained in:
parent
17cc5b9dc4
commit
d99491c1f4
3 changed files with 41 additions and 23 deletions
|
@ -150,11 +150,11 @@ class Tokenizer
|
||||||
$this->tokens[] = new Token(Token::ParamSeparator, '');
|
$this->tokens[] = new Token(Token::ParamSeparator, '');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// special case for unary minus
|
// special case for unary operations
|
||||||
if ($ch == '-') {
|
if ($ch == '-' || $ch == '+') {
|
||||||
if ($this->allowNegative) {
|
if ($this->allowNegative) {
|
||||||
$this->allowNegative = false;
|
$this->allowNegative = false;
|
||||||
$this->tokens[] = new Token(Token::Operator, '`');
|
$this->tokens[] = new Token(Token::Operator, $ch == '-' ? 'uNeg' : 'uPos');
|
||||||
continue 2;
|
continue 2;
|
||||||
}
|
}
|
||||||
// could be in exponent, in which case negative should be added to the numberBuffer
|
// could be in exponent, in which case negative should be added to the numberBuffer
|
||||||
|
|
|
@ -16,8 +16,8 @@ use NXP\Classes\CustomFunction;
|
||||||
use NXP\Classes\Operator;
|
use NXP\Classes\Operator;
|
||||||
use NXP\Classes\Tokenizer;
|
use NXP\Classes\Tokenizer;
|
||||||
use NXP\Exception\DivisionByZeroException;
|
use NXP\Exception\DivisionByZeroException;
|
||||||
use NXP\Exception\UnknownVariableException;
|
|
||||||
use NXP\Exception\MathExecutorException;
|
use NXP\Exception\MathExecutorException;
|
||||||
|
use NXP\Exception\UnknownVariableException;
|
||||||
use ReflectionException;
|
use ReflectionException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,7 +99,14 @@ class MathExecutor
|
||||||
170,
|
170,
|
||||||
false
|
false
|
||||||
],
|
],
|
||||||
'`' => [ // unary minus token
|
'uPos' => [ // unary positive token
|
||||||
|
function ($a) {
|
||||||
|
return $a;
|
||||||
|
},
|
||||||
|
200,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'uNeg' => [ // unary minus token
|
||||||
function ($a) {
|
function ($a) {
|
||||||
return 0 - $a;
|
return 0 - $a;
|
||||||
},
|
},
|
||||||
|
|
|
@ -252,6 +252,17 @@ class MathTest extends TestCase
|
||||||
$this->assertEquals(0, $calculator->execute('10 / 0'));
|
$this->assertEquals(0, $calculator->execute('10 / 0'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testUnaryOperators()
|
||||||
|
{
|
||||||
|
$calculator = new MathExecutor();
|
||||||
|
$this->assertEquals(5, $calculator->execute('+5'));
|
||||||
|
$this->assertEquals(5, $calculator->execute('+(3+2)'));
|
||||||
|
$this->assertEquals(-5, $calculator->execute('-5'));
|
||||||
|
$this->assertEquals(5, $calculator->execute('-(-5)'));
|
||||||
|
$this->assertEquals(-5, $calculator->execute('+(-5)'));
|
||||||
|
$this->assertEquals(-5, $calculator->execute('-(3+2)'));
|
||||||
|
}
|
||||||
|
|
||||||
public function testZeroDivisionException()
|
public function testZeroDivisionException()
|
||||||
{
|
{
|
||||||
$calculator = new MathExecutor();
|
$calculator = new MathExecutor();
|
||||||
|
|
Loading…
Reference in a new issue