2018-10-30 23:16:01 +03:00
# MathExecutor [![Stories in Ready](https://badge.waffle.io/NeonXP/MathExecutor.png?label=ready&title=Ready)](https://waffle.io/NeonXP/MathExecutor) [![Build Status](https://travis-ci.org/NeonXP/MathExecutor.png?branch=master)](https://travis-ci.org/NeonXP/MathExecutor)
2013-03-14 04:27:37 +04:00
2018-10-30 23:16:01 +03:00
A simple math expressions calculator
2013-09-06 08:26:53 +04:00
2018-10-30 23:16:01 +03:00
## Features:
2018-11-26 18:06:26 +03:00
* Built in support for +, -, *, / and power (^) operators plus ()
2018-10-30 23:16:01 +03:00
* Support for user defined operators
* Support for user defined functions
2018-12-20 00:07:24 +03:00
* Unlimited variable name lengths
* String support, as function parameters or as evaluated as a number by PHP
2018-10-30 23:16:01 +03:00
* Exceptions on divide by zero, or treat as zero
2018-12-20 00:07:24 +03:00
* Unary Minus (e.g. -3)
2018-11-26 18:06:26 +03:00
* Pi ($pi) and Euler's number ($e) support to 11 decimal places
2013-03-14 04:36:17 +04:00
2018-10-30 23:16:01 +03:00
## Install via Composer:
2013-09-06 17:30:48 +04:00
Stable branch
```
2018-11-26 18:06:26 +03:00
composer require "nxp/math-executor"
2013-09-06 17:30:48 +04:00
```
2018-10-30 23:16:01 +03:00
Dev branch (currently unsupported)
2013-09-06 17:30:48 +04:00
```
2013-09-06 17:33:47 +04:00
composer require "nxp/math-executor" "dev-dev"
2013-09-06 17:30:48 +04:00
```
2013-08-03 14:47:47 +04:00
## Sample usage:
```php
require "vendor/autoload.php";
2018-10-30 23:16:01 +03:00
$executor = new \NXP\MathExecutor();
2013-08-03 14:47:47 +04:00
2018-10-30 23:16:01 +03:00
echo $executor->execute("1 + 2 * (2 - (4+10))^2 + sin(10)");
2013-08-03 14:47:47 +04:00
```
## Functions:
Default functions:
* sin
* cos
* tn
* asin
2013-09-06 05:42:09 +04:00
* acos
2013-08-03 14:47:47 +04:00
* atn
2013-09-06 05:42:09 +04:00
* min
* max
* avg
2013-08-03 14:47:47 +04:00
Add custom function to executor:
```php
$executor->addFunction('abs', function($arg) {
return abs($arg);
2013-09-06 05:42:09 +04:00
}, 1);
2013-08-03 14:47:47 +04:00
```
## Operators:
Default operators: `+ - * / ^`
2013-09-06 05:42:09 +04:00
Add custom operator to executor:
2013-08-03 14:47:47 +04:00
```php
2013-09-06 05:42:09 +04:00
< ?php
namespace MyNamespace;
use NXP\Classes\Token\AbstractOperator;
class ModulusToken extends AbstractOperator
{
/**
* Regex of this operator
* @return string
*/
public static function getRegex()
{
return '\%';
}
/**
* Priority of this operator
* @return int
*/
public function getPriority()
{
return 3;
}
/**
* Associaion of this operator (self::LEFT_ASSOC or self::RIGHT_ASSOC)
* @return string
*/
public function getAssociation()
{
return self::LEFT_ASSOC;
}
/**
* Execution of this operator
* @param InterfaceToken[] $stack Stack of tokens
* @return TokenNumber Result of execution
*/
public function execute(& $stack)
{
$op2 = array_pop($stack);
$op1 = array_pop($stack);
$result = $op1->getValue() % $op2->getValue();
return new TokenNumber($result);
}
}
```
And adding to executor:
2013-08-03 14:47:47 +04:00
2013-09-06 05:42:09 +04:00
```php
$executor->addOperator('MyNamespace\ModulusToken');
2013-09-06 08:19:02 +04:00
```
## Variables:
Default variables:
2013-09-06 08:35:55 +04:00
```
2013-09-06 08:19:02 +04:00
$pi = 3.14159265359
$e = 2.71828182846
2013-09-06 08:35:55 +04:00
```
2013-09-06 08:19:02 +04:00
2018-12-20 00:07:24 +03:00
You can add your own variables to executor:
2013-09-06 08:19:02 +04:00
```php
2018-10-30 23:16:01 +03:00
$executor->setVars([
2013-09-06 08:19:02 +04:00
'var1' => 0.15,
'var2' => 0.22
2018-10-30 23:16:01 +03:00
]);
echo $executor->execute("$var1 + $var2");
```
## Division By Zero Support:
2018-12-20 00:07:24 +03:00
By default, the result of division by zero is zero and no error is generated. You have the option to thow a \NXP\Exception\DivisionByZeroException by calling setDivisionByZeroException.
2013-09-06 08:19:02 +04:00
2018-10-30 23:16:01 +03:00
```php
$executor->setDivisionByZeroException();
try {
echo $executor->execute('1/0');
} catch (\NXP\Exception\DivisionByZeroException $e) {
echo $e->getMessage();
}
```
## Unary Minus Operator:
Negative numbers are supported via the unary minus operator, but need to have a space before the minus sign. `-1+ -3` is legal, while '`-1+-3` will produce an error due to the way the parser works. Positive numbers are not explicitly supported as unsigned numbers are assumed positive.
## String Support:
2018-12-20 00:07:24 +03:00
Expressions can contain double or single quoted strings that are evaluated the same way as PHP evalutes strings as numbers. You can also pass strings to functions.
2018-10-30 23:16:01 +03:00
```php
echo $executor->execute("1 + '2.5' * '.5' + myFunction('category')");
```