aboutsummaryrefslogtreecommitdiff
path: root/node_modules/math-expression-evaluator
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/math-expression-evaluator
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/math-expression-evaluator')
-rwxr-xr-xnode_modules/math-expression-evaluator/LICENSE22
-rwxr-xr-xnode_modules/math-expression-evaluator/README.md88
-rwxr-xr-xnode_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.js636
-rwxr-xr-xnode_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.min.js26
-rwxr-xr-xnode_modules/math-expression-evaluator/package.json32
-rwxr-xr-xnode_modules/math-expression-evaluator/src/formula_evaluator.js41
-rwxr-xr-xnode_modules/math-expression-evaluator/src/lexer.js309
-rwxr-xr-xnode_modules/math-expression-evaluator/src/math_function.js120
-rwxr-xr-xnode_modules/math-expression-evaluator/src/postfix.js50
-rwxr-xr-xnode_modules/math-expression-evaluator/src/postfix_evaluator.js105
-rwxr-xr-xnode_modules/math-expression-evaluator/test/index.js171
11 files changed, 1600 insertions, 0 deletions
diff --git a/node_modules/math-expression-evaluator/LICENSE b/node_modules/math-expression-evaluator/LICENSE
new file mode 100755
index 00000000..4fe6c913
--- /dev/null
+++ b/node_modules/math-expression-evaluator/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Ankit G.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/math-expression-evaluator/README.md b/node_modules/math-expression-evaluator/README.md
new file mode 100755
index 00000000..d394392b
--- /dev/null
+++ b/node_modules/math-expression-evaluator/README.md
@@ -0,0 +1,88 @@
+
+
+# math-expression-evaluator
+An extremely efficient, flexible and amazing evaluator for Math expression in Javascript.([Documentation](http://redhivesoftware.github.io/math-expression-evaluator/))
+
+## Use cases
+|Input|Result|Explanation|
+|:---:|:---:| --- |
+|**2+3-1**|4| Addition and Subtraction operator |
+|**2\*5/10**|1| Multiplication and Division operator |
+|**tan45** *or* **tan(45)**|1| Trigonometric Function ( tan in Degree mode) |
+|**tan45** *or* **tan(45)**|1.619775190543862| Trigonometric Function ( tan in Radian mode) |
+|**Pi1,15,n** *or* **Pi(1,15,n)**|1307674368000| Product of Sequence |
+|**Sigma1,15,n** *or* **Sigma(1,15,n)**|120| Sum of Sequence( also called summation) |
+|**2^3**|8| Exponent( note this operator is left associative like MS Office) |
+|**5P3**|60| Permutaion Method to calculate all the permutaions |
+|**sincostan90** *or* **sin(cos(tan(90)))**|0.017261434031253| Multiple functions with or without parenthesis (both works) |
+
+### [Fiddle Yourself](http://jsbin.com/fuyowu/1/edit?html,output)
+
+## Installation
+### Node JS
+ **Using npm**
+
+ npm install math-expression-evaluator
+
+### Browser
+ **Using bower**
+
+ bower install math-expression-evaluator
+
+### How to run test
+
+ npm test
+
+## Supported symbols
+
+|Symbol|Explanation|
+|:---:|:---:|
+|**+**| Addition Operator eg. 2+3 results 5 |
+|**-**| Subtraction Operator eg. 2-3 results -1 |
+|**/**| Division operator eg 3/2 results 1.5 |
+|**\***| Multiplication Operator eg. 2\*3 results 6 |
+|**Mod**| Modulus Operator eg. 3 Mod 2 results 1 |
+|**(**| Opening Parenthesis |
+|**)**| Closing Parenthesis |
+|**Sigma**| Summation eg. Sigma(1,100,n) results 5050 |
+|**Pi**| Product eg. Pi(1,10,n) results 3628800 |
+|**n**| Variable for Summation or Product |
+|**pi**| Math constant pi returns 3.14 |
+|**e**| Math constant e returns 2.71 |
+|**C**| Combination operator eg. 4C2 returns 6 |
+|**P**| Permutation operator eg. 4P2 returns 12 |
+|**!**| factorial operator eg. 4! returns 24 |
+|**log**| logarithmic function with base 10 eg. log 1000 returns 3 |
+|**ln**| natural log function with base e eg. ln 2 returns .3010 |
+|**pow**| power function with two operator pow(2,3) returns 8 |
+|**^**| power operator eg. 2^3 returns 8 |
+|**root**| underroot function root 4 returns 2 |
+|**sin**| Sine function |
+|**cos**| Cosine function |
+|**tan**| Tangent function |
+|**asin**| Inverse Sine funtion |
+|**acos**| Inverse Cosine funtion |
+|**atan**| Inverse Tangent funtion |
+|**sinh**| Hyperbolic Sine funtion |
+|**cosh**| Hyperbolic Cosine funtion |
+|**tanh**| Hyperbolic Tangent funtion |
+|**asinh**| Inverse Hyperbolic Sine funtion |
+|**acosh**| Inverse Hyperbolic Cosine funtion |
+|**atanh**| Inverse Hyperbolic Tangent funtion |
+
+## Features
+
+### Amazing support for Sigma and Pi
+This is a fantastic feature of this calculator that it is capable of evaluating expressions containing **Sigma and Pi**.
+Passing `Sigma(1,100,n)` will evaluate to 5050 as n is summationed from 1 to 100.
+and Pi(1,15,n) will evaluate to 1307674368000 as n is multiplied from 1 to 15 which is equal to 15!
+
+### Parenthesis less expression
+If a expression is readable by human then it is readable by this evaluator. There is no need to wrap every function inside parenthesis.
+For eg. sin90 will work totally fine instead of sin(90)
+
+
+##Changelog
+
+### Removed lodash.indexof and used native Array.prototype.indexOf hence dropping suppports for IE8 and below.
+This will reflect in next release named v1.2.16
diff --git a/node_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.js b/node_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.js
new file mode 100755
index 00000000..74d8e672
--- /dev/null
+++ b/node_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.js
@@ -0,0 +1,636 @@
+/** math-expression-evaluator version 1.2.17
+ Dated:2017-04-28 */
+
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mexp = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+var Mexp=require('./postfix_evaluator.js');
+Mexp.prototype.formulaEval = function () {
+ "use strict";
+ var stack=[],pop1,pop2,pop3;
+ var disp=[];
+ var temp='';
+ var arr=this.value;
+ for(var i=0;i<arr.length;i++){
+ if(arr[i].type===1||arr[i].type===3){
+ disp.push({value:arr[i].type===3?arr[i].show:arr[i].value,type:1});
+ }
+ else if(arr[i].type===13){
+ disp.push({value:arr[i].show,type:1});
+ }
+ else if(arr[i].type===0){
+ disp[disp.length-1]={value:arr[i].show+(arr[i].show!="-"?"(":"")+disp[disp.length-1].value+(arr[i].show!="-"?")":""),type:0};
+ }
+ else if(arr[i].type===7){
+ disp[disp.length-1]={value:(disp[disp.length-1].type!=1?"(":"")+disp[disp.length-1].value+(disp[disp.length-1].type!=1?")":"")+arr[i].show,type:7};
+ }
+ else if(arr[i].type===10){
+ pop1=disp.pop();
+ pop2=disp.pop();
+ if(arr[i].show==='P'||arr[i].show==='C')disp.push({value:"<sup>"+pop2.value+"</sup>"+arr[i].show+"<sub>"+pop1.value+"</sub>",type:10});
+ else disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+"<sup>"+pop1.value+"</sup>",type:1});
+ }
+ else if(arr[i].type===2||arr[i].type===9){
+ pop1=disp.pop();
+ pop2=disp.pop();
+ disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+arr[i].show+(pop1.type!=1?"(":"")+pop1.value+(pop1.type!=1?")":""),type:arr[i].type});
+ }
+ else if(arr[i].type===12){
+ pop1=disp.pop();
+ pop2=disp.pop();
+ pop3=disp.pop();
+ disp.push({value:arr[i].show+"("+pop3.value+","+pop2.value+","+pop1.value+")",type:12});
+ }
+ }
+ return disp[0].value;
+};
+module.exports=Mexp;
+},{"./postfix_evaluator.js":5}],2:[function(require,module,exports){
+var Mexp=require('./math_function.js');
+ function inc(arr,val){
+ for(var i=0;i<arr.length;i++)
+ arr[i]+=val;
+ return arr;
+ }
+ var token=['sin','cos','tan','pi','(',')','P','C',
+ 'asin','acos','atan','7','8','9','int',
+ 'cosh','acosh','ln','^','root','4','5','6','/','!',
+ 'tanh','atanh','Mod','1','2','3','*',
+ 'sinh','asinh','e','log','0','.','+','-',',','Sigma','n','Pi','pow'];
+ var show=['sin','cos','tan','&pi;','(',')','P','C',
+ 'asin','acos','atan','7','8','9','Int',
+ 'cosh','acosh',' ln','^','root','4','5','6','&divide;','!',
+ 'tanh','atanh',' Mod ','1','2','3','&times;',
+ 'sinh','asinh','e',' log','0','.','+','-',',','&Sigma;','n','&Pi;','pow'];
+ var eva=[Mexp.math.sin,Mexp.math.cos,Mexp.math.tan,'PI','(',')',Mexp.math.P,Mexp.math.C,
+ Mexp.math.asin,Mexp.math.acos,Mexp.math.atan,'7','8','9',Math.floor,
+ Mexp.math.cosh,Mexp.math.acosh,Math.log,Math.pow,Math.sqrt,'4','5','6',Mexp.math.div,Mexp.math.fact,
+ Mexp.math.tanh,Mexp.math.atanh,Mexp.math.mod,'1','2','3',Mexp.math.mul,
+ Mexp.math.sinh,Mexp.math.asinh,'E',Mexp.math.log,'0','.',Mexp.math.add,Mexp.math.sub,',',Mexp.math.sigma,'n',Mexp.math.Pi,Math.pow];
+ var preced={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0};
+ var type=[0,0,0,3,4,5,10,10,
+ 0,0,0,1,1,1,0,
+ 0,0,0,10,0,1,1,1,2,7,
+ 0,0,2,1,1,1,2,
+ 0,0,3,0,1,6,9,9,11,12,13,12,8];
+ /*
+ 0 : function with syntax function_name(Maths_exp)
+ 1 : numbers
+ 2 : binary operators like * / Mod left associate and same precedence
+ 3 : Math constant values like e,pi,Cruncher ans
+ 4 : opening bracket
+ 5 : closing bracket
+ 6 : decimal
+ 7 : function with syntax (Math_exp)function_name
+ 8: function with syntax function_name(Math_exp1,Math_exp2)
+ 9 : binary operator like +,-
+ 10: binary operator like P C or ^
+ 11: ,
+ 12: function with , seperated three parameters
+ 13: variable of Sigma function
+ */
+ var type0={0:true,1:true,3:true,4:true,6:true,8:true,9:true,12:true,13:true},//type2:true,type4:true,type9:true,type11:true,type21:true,type22
+ type1={0:true,1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true,9:true,10:true,11:true,12:true,13:true},//type3:true,type5:true,type7:true,type23
+ type_1={0:true,3:true,4:true,8:true,12:true,13:true},
+ empty={},
+ type_3={0:true,1:true,3:true,4:true,6:true,8:true,12:true,13:true},//type_5:true,type_7:true,type_23
+ type6={1:true},
+ newAr=[[],
+ ["1","2","3","7","8","9","4","5","6","+","-","*","/","(",")","^","!","P","C","e","0",".",",","n"],
+ ["pi","ln","Pi"],
+ ["sin","cos","tan","Del","int","Mod","log","pow"],
+ ["asin","acos","atan","cosh","root","tanh","sinh"],
+ ["acosh","atanh","asinh","Sigma"]];
+ function match(str1,str2,i,x){
+ for(var f=0;f<x;f++){
+ if (str1[i+f]!==str2[f])
+ return false;
+ }
+ return true;
+ }
+ Mexp.addToken=function(tokens){
+ for(i=0;i<tokens.length;i++){
+ x=tokens[i].token.length;
+ var temp=-1;
+
+ //newAr is a specially designed data structure in which 1D array at location one of 2d array has all string with length 1 2 with 2 and so on
+
+ if (x<newAr.length) //match to check if token is really huge and not existing
+ //if not checked it will break in next line as undefined index
+ for(y=0;y<newAr[x].length;y++){
+ if (tokens[i].token===newAr[x][y]){
+ temp=token.indexOf(newAr[x][y]);
+ break;
+ }
+ }
+ if (temp===-1) {
+ token.push(tokens[i].token);
+ type.push(tokens[i].type);
+ if(newAr.length<=tokens[i].token.length)
+ newAr[tokens[i].token.length]=[];
+ newAr[tokens[i].token.length].push(tokens[i].token);
+ eva.push(tokens[i].value);
+ show.push(tokens[i].show);
+ }
+ else {
+ token[temp]=tokens[i].token;
+ type[temp]=tokens[i].type;
+ eva[temp]=tokens[i].value;
+ show[temp]=tokens[i].show;
+ }
+ }
+ };
+ Mexp.lex=function(inp,tokens){
+ 'use strict';
+ var str=[{type:4,value:"(",show:"(",pre:0}];
+ var ptc=[]; //Parenthesis to close at the beginning is after one token
+ var inpStr=inp;
+ var key;
+ var pcounter=0;
+ var allowed=type0;
+ var bracToClose=0;
+ var asterick=empty;
+ var prevKey='';
+ var i,x,y;
+ if(typeof tokens!=="undefined")
+ Mexp.addToken(tokens);
+ var obj={};
+ for(i=0;i<inpStr.length;i++){
+ if (inpStr[i]==' ') {
+ continue;
+ }
+ key='';
+ sec:for(x=(inpStr.length-i>(newAr.length-2)?newAr.length-1:inpStr.length-i);x>0;x--){
+ for(y=0;y<newAr[x].length;y++){
+ if (match(inpStr,newAr[x][y],i,x)){
+ key=newAr[x][y];
+ break sec;
+ }
+ }
+ }
+ i+=key.length-1;
+ if(key===''){
+ throw(new Mexp.exception("Can't understand after "+inpStr.slice(i)));
+ }
+ var index=token.indexOf(key);
+ var cToken=key;
+ var cType=type[index];
+ var cEv=eva[index];
+ var cPre=preced[cType];
+ var cShow=show[index];
+ var pre=str[str.length-1];
+ for(j=ptc.length;j--;){ //loop over ptc
+ if(ptc[j]===0){
+ if([0,2,3,5,9,11,12,13].indexOf(cType)!==-1){
+ if(allowed[cType]!==true){
+ throw(new Mexp.exception(key+" is not allowed after "+prevKey));
+ }
+ str.push({value:")",type:5,pre:0,show:")"});
+ allowed=type1;
+ asterick=type_3;
+ inc(ptc,-1).pop();
+ }
+ }
+ }
+ if(allowed[cType]!==true){
+ throw(new Mexp.exception(key+" is not allowed after "+prevKey));
+ }
+ if(asterick[cType]===true){
+ cType=2;
+ cEv=Mexp.math.mul;
+ cShow="&times;";
+ cPre=3;
+ i=i-key.length;
+ }
+ obj={value:cEv,type:cType,pre:cPre,show:cShow};
+ if(cType===0){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2).push(2);
+ str.push(obj);
+ str.push({value:"(",type:4,pre:0,show:"("});
+ }
+ else if(cType===1){
+ if(pre.type===1){
+ pre.value+=cEv;
+ inc(ptc,1);
+ }
+ else {
+ str.push(obj);
+ }
+ allowed=type1;
+ asterick=type_1;
+ }
+ else if(cType===2){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2);
+ str.push(obj);
+ }
+ else if(cType===3){//constant
+ str.push(obj);
+ allowed=type1;
+ asterick=type_3;
+ }
+ else if(cType===4){
+ pcounter+=ptc.length;
+ ptc=[];
+ bracToClose++;
+ allowed=type0;
+ asterick=empty;
+ str.push(obj);
+ }
+ else if(cType===5){
+ if(!bracToClose){
+ throw(new Mexp.exception("Closing parenthesis are more than opening one, wait What!!!"));
+ }
+ while(pcounter--){ //loop over ptc
+ str.push({value:")",type:5,pre:0,show:")"});
+ }
+ pcounter=0;
+ bracToClose--;
+ allowed=type1;
+ asterick=type_3;
+ str.push(obj);
+ }
+ else if(cType===6){
+ if(pre.hasDec){
+ throw(new Mexp.exception("Two decimals are not allowed in one number"));
+ }
+ if(pre.type!==1){
+ pre={value:0,type:1,pre:0}; //pre needs to be changed as it will the last value now to be safe in later code
+ str.push(pre);
+ inc(ptc,-1);
+ }
+ allowed=type6;
+ inc(ptc,1);
+ asterick=empty;
+ pre.value+=cEv;
+ pre.hasDec=true;
+ }
+ else if(cType===7){
+ allowed=type1;
+ asterick=type_3;
+ inc(ptc,1);
+ str.push(obj);
+ }
+ if(cType===8){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,4).push(4);
+ str.push(obj);
+ str.push({value:"(",type:4,pre:0,show:"("});
+ }
+ else if(cType===9){
+ if(pre.type===9){
+ if(pre.value===Mexp.math.add){
+ pre.value=cEv;
+ pre.show=cShow;
+ inc(ptc,1);
+ }
+ else if(pre.value===Mexp.math.sub&&cShow==='-'){
+ pre.value=Mexp.math.add;
+ pre.show='+';
+ inc(ptc,1);
+ }
+ }
+ else if(pre.type!==5&&pre.type!==7&&pre.type!==1&&pre.type!==3&&pre.type!==13){//changesign only when negative is found
+ if(cToken==='-'){//do nothing for + token
+ //don't add with the above if statement as that will run the else statement of parent if on Ctoken +
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2).push(2);
+ str.push({value:Mexp.math.changeSign,type:0,pre:21,show:"-"});
+ str.push({value:"(",type:4,pre:0,show:"("});
+ }
+ }
+ else{
+ str.push(obj);
+ inc(ptc,2);
+ }
+ allowed=type0;
+ asterick=empty;
+ }
+ else if(cType===10){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2);
+ str.push(obj);
+ }
+ else if(cType===11){
+ allowed=type0;
+ asterick=empty;
+ str.push(obj);
+ }
+ else if(cType===12){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,6).push(6);
+ str.push(obj);
+ str.push({value:"(",type:4,pre:0});
+ }
+ else if(cType===13){
+ allowed=type1;
+ asterick=type_3;
+ str.push(obj);
+ }
+ inc(ptc,-1);
+ prevKey=key;
+ }
+ for(var j=ptc.length;j--;){ //loop over ptc
+ if(ptc[j]===0){
+
+ str.push({value:")",show:")",type:5,pre:3});
+ inc(ptc,-1).pop();
+ }
+ }
+ if (allowed[5]!==true) {
+ throw(new Mexp.exception("complete the expression"));
+ }
+ while(bracToClose--)
+ str.push({value:")",show:")",type:5,pre:3});
+
+ str.push({type:5,value:")",show:")",pre:0});
+// console.log(str);
+ return new Mexp(str);
+ };
+ module.exports=Mexp;
+
+},{"./math_function.js":3}],3:[function(require,module,exports){
+ var Mexp=function(parsed){
+ this.value=parsed;
+
+ };
+
+ Mexp.math={
+ isDegree:true, //mode of calculator
+ acos:function(x){
+ return (Mexp.math.isDegree?180/Math.PI*Math.acos(x):Math.acos(x));
+ },
+ add:function(a,b){
+ return a+b;
+ },
+ asin:function(x){
+ return (Mexp.math.isDegree?180/Math.PI*Math.asin(x):Math.asin(x));
+ },
+ atan:function(x){
+ return (Mexp.math.isDegree?180/Math.PI*Math.atan(x):Math.atan(x));
+ },
+ acosh:function(x){
+ return Math.log(x+Math.sqrt(x*x-1));
+ },
+ asinh:function(x){
+ return Math.log(x+Math.sqrt(x*x+1));
+ },
+ atanh:function(x){
+ return Math.log((1+x)/(1-x));
+ },
+ C:function(n,r){
+ var pro=1,other=n-r,choice=r;
+ if(choice<other){
+ choice=other;
+ other=r;
+ }
+ for(var i=choice+1;i<=n;i++)
+ pro*=i;
+ return pro/Mexp.math.fact(other);
+ },
+ changeSign:function(x){
+ return -x;
+ },
+ cos:function(x){
+ if(Mexp.math.isDegree)x=Mexp.math.toRadian(x);
+ return Math.cos(x);
+ },
+ cosh:function(x){
+ return (Math.pow(Math.E,x)+Math.pow(Math.E,-1*x))/2;
+ },
+ div:function(a,b){
+ return a/b;
+ },
+ fact:function(n) {
+ if(n%1!==0)return "NAN";
+ var pro=1;
+ for(var i=2;i<=n;i++)
+ pro*=i;
+ return pro;
+ },
+ inverse:function(x){
+ return 1/x;
+ },
+ log:function(i){
+ return Math.log(i)/Math.log(10);
+ },
+ mod:function(a,b){
+ return a%b;
+ },
+ mul:function(a,b){
+ return a*b;
+ },
+ P:function(n,r){var pro=1;
+ for(var i=Math.floor(n)-Math.floor(r)+1;i<=Math.floor(n);i++)
+ pro*=i;
+ return pro;
+
+ },
+ Pi:function(low,high,ex){
+ var pro=1;
+ for(var i=low;i<=high;i++){
+ pro*=Number(ex.postfixEval({n:i}));
+ }
+ return pro;
+ },
+ pow10x:function(e){
+ var x=1;
+ while(e--){x*=10;}
+ return x;
+ },
+ sigma:function(low,high,ex){
+ var sum=0;
+ for(var i=low;i<=high;i++){
+ sum+=Number(ex.postfixEval({n:i}));
+ }
+ return sum;
+ },
+ sin:function(x){
+ if(Mexp.math.isDegree)x=Mexp.math.toRadian(x);
+ return Math.sin(x);
+ },
+ sinh:function(x){
+ return (Math.pow(Math.E,x)-Math.pow(Math.E,-1*x))/2;
+ },
+ sub:function(a,b){
+ return a-b;
+ },
+ tan:function(x){
+ if(Mexp.math.isDegree)x=Mexp.math.toRadian(x);
+ return Math.tan(x);
+ },
+ tanh:function(x){
+ return Mexp.sinha(x)/Mexp.cosha(x);
+ },
+ toRadian:function(x){
+ return x*Math.PI/180;
+ }
+ };
+ Mexp.exception=function(message){
+ this.message=message;
+ };
+ module.exports=Mexp;
+},{}],4:[function(require,module,exports){
+
+ var Mexp=require('./lexer.js');
+
+ Mexp.prototype.toPostfix = function () {
+ 'use strict';
+ var post=[],elem,popped,prep,pre,ele;
+ var stack=[{value:"(",type:4,pre:0}];
+ var arr=this.value;
+ for (var i=1; i < arr.length; i++) {
+ if(arr[i].type===1||arr[i].type===3||arr[i].type===13){ //if token is number,constant,or n(which is also a special constant in our case)
+ if(arr[i].type===1)
+ arr[i].value=Number(arr[i].value);
+ post.push(arr[i]);
+ }
+ else if(arr[i].type===4){
+ stack.push(arr[i]);
+ }
+ else if(arr[i].type===5){
+ while((popped=stack.pop()).type!==4){
+ post.push(popped);
+ }
+ }
+ else if(arr[i].type===11){
+ while((popped=stack.pop()).type!==4){
+ post.push(popped);
+ }
+ stack.push(popped);
+ }
+ else {
+ elem=arr[i];
+ pre=elem.pre;
+ ele=stack[stack.length-1];
+ prep=ele.pre;
+ var flag=ele.value=='Math.pow'&&elem.value=='Math.pow';
+ if(pre>prep)stack.push(elem);
+ else {
+ while(prep>=pre&&!flag||flag&&pre<prep){
+ popped=stack.pop();
+ ele=stack[stack.length-1];
+ post.push(popped);
+ prep=ele.pre;
+ flag=elem.value=='Math.pow'&&ele.value=='Math.pow';
+ }
+ stack.push(elem);
+ }
+ }
+ }
+ return new Mexp(post);
+ };
+ module.exports=Mexp;
+},{"./lexer.js":2}],5:[function(require,module,exports){
+var Mexp=require('./postfix.js');
+Mexp.prototype.postfixEval = function (UserDefined) {
+ 'use strict';
+ UserDefined=UserDefined||{};
+ UserDefined.PI=Math.PI;
+ UserDefined.E=Math.E;
+ var stack=[],pop1,pop2,pop3;
+ var disp=[];
+ var temp='';
+ var arr=this.value;
+ var bool=(typeof UserDefined.n!=="undefined");
+ for(var i=0;i<arr.length;i++){
+ if(arr[i].type===1){
+ stack.push({value:arr[i].value,type:1});
+ }
+ else if(arr[i].type===3){
+ stack.push({value:UserDefined[arr[i].value],type:1});
+ }
+ else if(arr[i].type===0){
+ if(typeof stack[stack.length-1].type==="undefined"){
+ stack[stack.length-1].value.push(arr[i]);
+ }
+ else stack[stack.length-1].value=arr[i].value(stack[stack.length-1].value);
+ }
+ else if(arr[i].type===7){
+ if(typeof stack[stack.length-1].type==="undefined"){
+ stack[stack.length-1].value.push(arr[i]);
+ }
+ else stack[stack.length-1].value=arr[i].value(stack[stack.length-1].value);
+ }
+ else if(arr[i].type===8){
+ pop1=stack.pop();
+ pop2=stack.pop();
+ stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
+ }
+ else if(arr[i].type===10){
+ pop1=stack.pop();
+ pop2=stack.pop();
+ if(typeof pop2.type==="undefined"){
+ pop2.value=pop2.concat(pop1);
+ pop2.value.push(arr[i]);
+ stack.push(pop2);
+ }
+ else if (typeof pop1.type==="undefined") {
+ pop1.unshift(pop2);
+ pop1.push(arr[i]);
+ stack.push(pop1);
+ }
+ else{
+ stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
+ }
+ }
+ else if(arr[i].type===2||arr[i].type===9){
+ pop1=stack.pop();
+ pop2=stack.pop();
+ if(typeof pop2.type==="undefined"){
+ console.log(pop2);
+ pop2=pop2.concat(pop1);
+ pop2.push(arr[i]);
+ stack.push(pop2);
+ }
+ else if (typeof pop1.type==="undefined") {
+ pop1.unshift(pop2);
+ pop1.push(arr[i]);
+ stack.push(pop1);
+ }
+ else{
+ stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
+ }
+ }
+ else if(arr[i].type===12){
+ pop1=stack.pop();
+ if (typeof pop1.type!=="undefined") {
+ pop1=[pop1];
+ }
+ pop2=stack.pop();
+ pop3=stack.pop();
+ stack.push({type:1,value:arr[i].value(pop3.value,pop2.value,new Mexp(pop1))});
+ }
+ else if(arr[i].type===13){
+ if(bool){
+ stack.push({value:UserDefined[arr[i].value],type:3});
+ }
+ else stack.push([arr[i]]);
+ }
+ }
+ if (stack.length>1) {
+ throw(new Mexp.exception("Uncaught Syntax error"));
+ }
+ return stack[0].value>1000000000000000?"Infinity":parseFloat(stack[0].value.toFixed(15));
+};
+Mexp.eval=function(str,tokens,obj){
+ if (typeof tokens==="undefined") {
+ return this.lex(str).toPostfix().postfixEval();
+ }
+ else if (typeof obj==="undefined") {
+ if (typeof tokens.length!=="undefined")
+ return this.lex(str,tokens).toPostfix().postfixEval();
+ else
+ return this.lex(str).toPostfix().postfixEval(tokens);
+ }
+ else
+ return this.lex(str,tokens).toPostfix().postfixEval(obj);
+};
+module.exports=Mexp;
+},{"./postfix.js":4}]},{},[1])(1)
+}); \ No newline at end of file
diff --git a/node_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.min.js b/node_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.min.js
new file mode 100755
index 00000000..0e4520ea
--- /dev/null
+++ b/node_modules/math-expression-evaluator/dist/browser/math-expression-evaluator.min.js
@@ -0,0 +1,26 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) Ankit
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:</p>
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+/** math-expression-evaluator version 1.2.17
+ Dated:2017-04-28 */
+!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a("./postfix_evaluator.js");d.prototype.formulaEval=function(){"use strict";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+("-"!=e[f].show?"(":"")+d[d.length-1].value+("-"!=e[f].show?")":""),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?"(":"")+d[d.length-1].value+(1!=d[d.length-1].type?")":"")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),"P"===e[f].show||"C"===e[f].show?d.push({value:"<sup>"+b.value+"</sup>"+e[f].show+"<sub>"+a.value+"</sub>",type:10}):d.push({value:(1!=b.type?"(":"")+b.value+(1!=b.type?")":"")+"<sup>"+a.value+"</sup>",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?"(":"")+b.value+(1!=b.type?")":"")+e[f].show+(1!=a.type?"(":"")+a.value+(1!=a.type?")":""),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+"("+c.value+","+b.value+","+a.value+")",type:12}));return d[0].value},b.exports=d},{"./postfix_evaluator.js":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a("./math_function.js"),g=["sin","cos","tan","pi","(",")","P","C","asin","acos","atan","7","8","9","int","cosh","acosh","ln","^","root","4","5","6","/","!","tanh","atanh","Mod","1","2","3","*","sinh","asinh","e","log","0",".","+","-",",","Sigma","n","Pi","pow"],h=["sin","cos","tan","&pi;","(",")","P","C","asin","acos","atan","7","8","9","Int","cosh","acosh"," ln","^","root","4","5","6","&divide;","!","tanh","atanh"," Mod ","1","2","3","&times;","sinh","asinh","e"," log","0",".","+","-",",","&Sigma;","n","&Pi;","pow"],j=[f.math.sin,f.math.cos,f.math.tan,"PI","(",")",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,"7","8","9",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,"4","5","6",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,"1","2","3",f.math.mul,f.math.sinh,f.math.asinh,"E",f.math.log,"0",".",f.math.add,f.math.sub,",",f.math.sigma,"n",f.math.Pi,Math.pow],k={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},l=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],m={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},n={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},o={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},p={},q={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},r={1:!0},s=[[],["1","2","3","7","8","9","4","5","6","+","-","*","/","(",")","^","!","P","C","e","0",".",",","n"],["pi","ln","Pi"],["sin","cos","tan","Del","int","Mod","log","pow"],["asin","acos","atan","cosh","root","tanh","sinh"],["acosh","atanh","asinh","Sigma"]];f.addToken=function(a){for(i=0;i<a.length;i++){x=a[i].token.length;var b=-1;if(x<s.length)for(y=0;y<s[x].length;y++)if(a[i].token===s[x][y]){b=g.indexOf(s[x][y]);break}b===-1?(g.push(a[i].token),l.push(a[i].type),s.length<=a[i].token.length&&(s[a[i].token.length]=[]),s[a[i].token.length].push(a[i].token),j.push(a[i].value),h.push(a[i].show)):(g[b]=a[i].token,l[b]=a[i].type,j[b]=a[i].value,h[b]=a[i].show)}},f.lex=function(a,b){"use strict";var c,i,t,u,v=[{type:4,value:"(",show:"(",pre:0}],w=[],x=a,y=0,z=m,A=0,B=p,C="";"undefined"!=typeof b&&f.addToken(b);var D={};for(i=0;i<x.length;i++)if(" "!=x[i]){c="";a:for(t=x.length-i>s.length-2?s.length-1:x.length-i;t>0;t--)for(u=0;u<s[t].length;u++)if(e(x,s[t][u],i,t)){c=s[t][u];break a}if(i+=c.length-1,""===c)throw new f.exception("Can't understand after "+x.slice(i));var E=g.indexOf(c),F=c,G=l[E],H=j[E],I=k[G],J=h[E],K=v[v.length-1];for(L=w.length;L--;)if(0===w[L]&&[0,2,3,5,9,11,12,13].indexOf(G)!==-1){if(z[G]!==!0)throw new f.exception(c+" is not allowed after "+C);v.push({value:")",type:5,pre:0,show:")"}),z=n,B=q,d(w,-1).pop()}if(z[G]!==!0)throw new f.exception(c+" is not allowed after "+C);if(B[G]===!0&&(G=2,H=f.math.mul,J="&times;",I=3,i-=c.length),D={value:H,type:G,pre:I,show:J},0===G)z=m,B=p,d(w,2).push(2),v.push(D),v.push({value:"(",type:4,pre:0,show:"("});else if(1===G)1===K.type?(K.value+=H,d(w,1)):v.push(D),z=n,B=o;else if(2===G)z=m,B=p,d(w,2),v.push(D);else if(3===G)v.push(D),z=n,B=q;else if(4===G)y+=w.length,w=[],A++,z=m,B=p,v.push(D);else if(5===G){if(!A)throw new f.exception("Closing parenthesis are more than opening one, wait What!!!");for(;y--;)v.push({value:")",type:5,pre:0,show:")"});y=0,A--,z=n,B=q,v.push(D)}else if(6===G){if(K.hasDec)throw new f.exception("Two decimals are not allowed in one number");1!==K.type&&(K={value:0,type:1,pre:0},v.push(K),d(w,-1)),z=r,d(w,1),B=p,K.value+=H,K.hasDec=!0}else 7===G&&(z=n,B=q,d(w,1),v.push(D));8===G?(z=m,B=p,d(w,4).push(4),v.push(D),v.push({value:"(",type:4,pre:0,show:"("})):9===G?(9===K.type?K.value===f.math.add?(K.value=H,K.show=J,d(w,1)):K.value===f.math.sub&&"-"===J&&(K.value=f.math.add,K.show="+",d(w,1)):5!==K.type&&7!==K.type&&1!==K.type&&3!==K.type&&13!==K.type?"-"===F&&(z=m,B=p,d(w,2).push(2),v.push({value:f.math.changeSign,type:0,pre:21,show:"-"}),v.push({value:"(",type:4,pre:0,show:"("})):(v.push(D),d(w,2)),z=m,B=p):10===G?(z=m,B=p,d(w,2),v.push(D)):11===G?(z=m,B=p,v.push(D)):12===G?(z=m,B=p,d(w,6).push(6),v.push(D),v.push({value:"(",type:4,pre:0})):13===G&&(z=n,B=q,v.push(D)),d(w,-1),C=c}for(var L=w.length;L--;)0===w[L]&&(v.push({value:")",show:")",type:5,pre:3}),d(w,-1).pop());if(z[5]!==!0)throw new f.exception("complete the expression");for(;A--;)v.push({value:")",show:")",type:5,pre:3});return v.push({type:5,value:")",show:")",pre:0}),new f(v)},b.exports=f},{"./math_function.js":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))/2},div:function(a,b){return a/b},fact:function(a){if(a%1!==0)return"NAN";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1/a},log:function(a){return Math.log(a)/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)/d.cosha(a)},toRadian:function(a){return a*Math.PI/180}},d.exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a("./lexer.js");d.prototype.toPostfix=function(){"use strict";for(var a,b,c,e,f,g=[],h=[{value:"(",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k="Math.pow"==f.value&&"Math.pow"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k="Math.pow"==a.value&&"Math.pow"==f.value;h.push(a)}}return new d(g)},b.exports=d},{"./lexer.js":2}],5:[function(a,b,c){var d=a("./postfix.js");d.prototype.postfixEval=function(a){"use strict";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h="undefined"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?"undefined"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?"undefined"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),"undefined"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):"undefined"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),"undefined"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):"undefined"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),"undefined"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception("Uncaught Syntax error");return f[0].value>1e15?"Infinity":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return"undefined"==typeof b?this.lex(a).toPostfix().postfixEval():"undefined"==typeof c?"undefined"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{"./postfix.js":4}]},{},[1])(1)}); \ No newline at end of file
diff --git a/node_modules/math-expression-evaluator/package.json b/node_modules/math-expression-evaluator/package.json
new file mode 100755
index 00000000..74088c64
--- /dev/null
+++ b/node_modules/math-expression-evaluator/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "math-expression-evaluator",
+ "version": "1.2.17",
+ "description": "A flexible math expression evaluator",
+ "main": "src/formula_evaluator.js",
+ "scripts": {
+ "test": "mocha"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/redhivesoftware/math-expression-evaluator#readme"
+ },
+ "keywords": [
+ "math",
+ "expression",
+ "evaluator",
+ "parser"
+ ],
+ "author": "Ankit<ankitbug94@gmail.com>",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/redhivesoftware/math-expression-evaluator/issues"
+ },
+ "homepage": "https://github.com/redhivesoftware/math-expression-evaluator#readme",
+ "devDependencies": {
+ "grunt": "^0.4.5",
+ "grunt-browserify": "^3.8.0",
+ "grunt-contrib-jshint": "^0.11.2",
+ "grunt-contrib-uglify": "^0.9.1",
+ "mocha": "^2.2.5"
+ }
+}
diff --git a/node_modules/math-expression-evaluator/src/formula_evaluator.js b/node_modules/math-expression-evaluator/src/formula_evaluator.js
new file mode 100755
index 00000000..72db4eb5
--- /dev/null
+++ b/node_modules/math-expression-evaluator/src/formula_evaluator.js
@@ -0,0 +1,41 @@
+var Mexp=require('./postfix_evaluator.js');
+Mexp.prototype.formulaEval = function () {
+ "use strict";
+ var stack=[],pop1,pop2,pop3;
+ var disp=[];
+ var temp='';
+ var arr=this.value;
+ for(var i=0;i<arr.length;i++){
+ if(arr[i].type===1||arr[i].type===3){
+ disp.push({value:arr[i].type===3?arr[i].show:arr[i].value,type:1});
+ }
+ else if(arr[i].type===13){
+ disp.push({value:arr[i].show,type:1});
+ }
+ else if(arr[i].type===0){
+ disp[disp.length-1]={value:arr[i].show+(arr[i].show!="-"?"(":"")+disp[disp.length-1].value+(arr[i].show!="-"?")":""),type:0};
+ }
+ else if(arr[i].type===7){
+ disp[disp.length-1]={value:(disp[disp.length-1].type!=1?"(":"")+disp[disp.length-1].value+(disp[disp.length-1].type!=1?")":"")+arr[i].show,type:7};
+ }
+ else if(arr[i].type===10){
+ pop1=disp.pop();
+ pop2=disp.pop();
+ if(arr[i].show==='P'||arr[i].show==='C')disp.push({value:"<sup>"+pop2.value+"</sup>"+arr[i].show+"<sub>"+pop1.value+"</sub>",type:10});
+ else disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+"<sup>"+pop1.value+"</sup>",type:1});
+ }
+ else if(arr[i].type===2||arr[i].type===9){
+ pop1=disp.pop();
+ pop2=disp.pop();
+ disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+arr[i].show+(pop1.type!=1?"(":"")+pop1.value+(pop1.type!=1?")":""),type:arr[i].type});
+ }
+ else if(arr[i].type===12){
+ pop1=disp.pop();
+ pop2=disp.pop();
+ pop3=disp.pop();
+ disp.push({value:arr[i].show+"("+pop3.value+","+pop2.value+","+pop1.value+")",type:12});
+ }
+ }
+ return disp[0].value;
+};
+module.exports=Mexp; \ No newline at end of file
diff --git a/node_modules/math-expression-evaluator/src/lexer.js b/node_modules/math-expression-evaluator/src/lexer.js
new file mode 100755
index 00000000..14755671
--- /dev/null
+++ b/node_modules/math-expression-evaluator/src/lexer.js
@@ -0,0 +1,309 @@
+var Mexp=require('./math_function.js');
+ function inc(arr,val){
+ for(var i=0;i<arr.length;i++)
+ arr[i]+=val;
+ return arr;
+ }
+ var token=['sin','cos','tan','pi','(',')','P','C',
+ 'asin','acos','atan','7','8','9','int',
+ 'cosh','acosh','ln','^','root','4','5','6','/','!',
+ 'tanh','atanh','Mod','1','2','3','*',
+ 'sinh','asinh','e','log','0','.','+','-',',','Sigma','n','Pi','pow'];
+ var show=['sin','cos','tan','&pi;','(',')','P','C',
+ 'asin','acos','atan','7','8','9','Int',
+ 'cosh','acosh',' ln','^','root','4','5','6','&divide;','!',
+ 'tanh','atanh',' Mod ','1','2','3','&times;',
+ 'sinh','asinh','e',' log','0','.','+','-',',','&Sigma;','n','&Pi;','pow'];
+ var eva=[Mexp.math.sin,Mexp.math.cos,Mexp.math.tan,'PI','(',')',Mexp.math.P,Mexp.math.C,
+ Mexp.math.asin,Mexp.math.acos,Mexp.math.atan,'7','8','9',Math.floor,
+ Mexp.math.cosh,Mexp.math.acosh,Math.log,Math.pow,Math.sqrt,'4','5','6',Mexp.math.div,Mexp.math.fact,
+ Mexp.math.tanh,Mexp.math.atanh,Mexp.math.mod,'1','2','3',Mexp.math.mul,
+ Mexp.math.sinh,Mexp.math.asinh,'E',Mexp.math.log,'0','.',Mexp.math.add,Mexp.math.sub,',',Mexp.math.sigma,'n',Mexp.math.Pi,Math.pow];
+ var preced={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0};
+ var type=[0,0,0,3,4,5,10,10,
+ 0,0,0,1,1,1,0,
+ 0,0,0,10,0,1,1,1,2,7,
+ 0,0,2,1,1,1,2,
+ 0,0,3,0,1,6,9,9,11,12,13,12,8];
+ /*
+ 0 : function with syntax function_name(Maths_exp)
+ 1 : numbers
+ 2 : binary operators like * / Mod left associate and same precedence
+ 3 : Math constant values like e,pi,Cruncher ans
+ 4 : opening bracket
+ 5 : closing bracket
+ 6 : decimal
+ 7 : function with syntax (Math_exp)function_name
+ 8: function with syntax function_name(Math_exp1,Math_exp2)
+ 9 : binary operator like +,-
+ 10: binary operator like P C or ^
+ 11: ,
+ 12: function with , seperated three parameters
+ 13: variable of Sigma function
+ */
+ var type0={0:true,1:true,3:true,4:true,6:true,8:true,9:true,12:true,13:true},//type2:true,type4:true,type9:true,type11:true,type21:true,type22
+ type1={0:true,1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true,9:true,10:true,11:true,12:true,13:true},//type3:true,type5:true,type7:true,type23
+ type_1={0:true,3:true,4:true,8:true,12:true,13:true},
+ empty={},
+ type_3={0:true,1:true,3:true,4:true,6:true,8:true,12:true,13:true},//type_5:true,type_7:true,type_23
+ type6={1:true},
+ newAr=[[],
+ ["1","2","3","7","8","9","4","5","6","+","-","*","/","(",")","^","!","P","C","e","0",".",",","n"],
+ ["pi","ln","Pi"],
+ ["sin","cos","tan","Del","int","Mod","log","pow"],
+ ["asin","acos","atan","cosh","root","tanh","sinh"],
+ ["acosh","atanh","asinh","Sigma"]];
+ function match(str1,str2,i,x){
+ for(var f=0;f<x;f++){
+ if (str1[i+f]!==str2[f])
+ return false;
+ }
+ return true;
+ }
+ Mexp.addToken=function(tokens){
+ for(i=0;i<tokens.length;i++){
+ x=tokens[i].token.length;
+ var temp=-1;
+
+ //newAr is a specially designed data structure in which 1D array at location one of 2d array has all string with length 1 2 with 2 and so on
+
+ if (x<newAr.length) //match to check if token is really huge and not existing
+ //if not checked it will break in next line as undefined index
+ for(y=0;y<newAr[x].length;y++){
+ if (tokens[i].token===newAr[x][y]){
+ temp=token.indexOf(newAr[x][y]);
+ break;
+ }
+ }
+ if (temp===-1) {
+ token.push(tokens[i].token);
+ type.push(tokens[i].type);
+ if(newAr.length<=tokens[i].token.length)
+ newAr[tokens[i].token.length]=[];
+ newAr[tokens[i].token.length].push(tokens[i].token);
+ eva.push(tokens[i].value);
+ show.push(tokens[i].show);
+ }
+ else {
+ token[temp]=tokens[i].token;
+ type[temp]=tokens[i].type;
+ eva[temp]=tokens[i].value;
+ show[temp]=tokens[i].show;
+ }
+ }
+ };
+ Mexp.lex=function(inp,tokens){
+ 'use strict';
+ var str=[{type:4,value:"(",show:"(",pre:0}];
+ var ptc=[]; //Parenthesis to close at the beginning is after one token
+ var inpStr=inp;
+ var key;
+ var pcounter=0;
+ var allowed=type0;
+ var bracToClose=0;
+ var asterick=empty;
+ var prevKey='';
+ var i,x,y;
+ if(typeof tokens!=="undefined")
+ Mexp.addToken(tokens);
+ var obj={};
+ for(i=0;i<inpStr.length;i++){
+ if (inpStr[i]==' ') {
+ continue;
+ }
+ key='';
+ sec:for(x=(inpStr.length-i>(newAr.length-2)?newAr.length-1:inpStr.length-i);x>0;x--){
+ for(y=0;y<newAr[x].length;y++){
+ if (match(inpStr,newAr[x][y],i,x)){
+ key=newAr[x][y];
+ break sec;
+ }
+ }
+ }
+ i+=key.length-1;
+ if(key===''){
+ throw(new Mexp.exception("Can't understand after "+inpStr.slice(i)));
+ }
+ var index=token.indexOf(key);
+ var cToken=key;
+ var cType=type[index];
+ var cEv=eva[index];
+ var cPre=preced[cType];
+ var cShow=show[index];
+ var pre=str[str.length-1];
+ for(j=ptc.length;j--;){ //loop over ptc
+ if(ptc[j]===0){
+ if([0,2,3,5,9,11,12,13].indexOf(cType)!==-1){
+ if(allowed[cType]!==true){
+ throw(new Mexp.exception(key+" is not allowed after "+prevKey));
+ }
+ str.push({value:")",type:5,pre:0,show:")"});
+ allowed=type1;
+ asterick=type_3;
+ inc(ptc,-1).pop();
+ }
+ }
+ }
+ if(allowed[cType]!==true){
+ throw(new Mexp.exception(key+" is not allowed after "+prevKey));
+ }
+ if(asterick[cType]===true){
+ cType=2;
+ cEv=Mexp.math.mul;
+ cShow="&times;";
+ cPre=3;
+ i=i-key.length;
+ }
+ obj={value:cEv,type:cType,pre:cPre,show:cShow};
+ if(cType===0){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2).push(2);
+ str.push(obj);
+ str.push({value:"(",type:4,pre:0,show:"("});
+ }
+ else if(cType===1){
+ if(pre.type===1){
+ pre.value+=cEv;
+ inc(ptc,1);
+ }
+ else {
+ str.push(obj);
+ }
+ allowed=type1;
+ asterick=type_1;
+ }
+ else if(cType===2){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2);
+ str.push(obj);
+ }
+ else if(cType===3){//constant
+ str.push(obj);
+ allowed=type1;
+ asterick=type_3;
+ }
+ else if(cType===4){
+ pcounter+=ptc.length;
+ ptc=[];
+ bracToClose++;
+ allowed=type0;
+ asterick=empty;
+ str.push(obj);
+ }
+ else if(cType===5){
+ if(!bracToClose){
+ throw(new Mexp.exception("Closing parenthesis are more than opening one, wait What!!!"));
+ }
+ while(pcounter--){ //loop over ptc
+ str.push({value:")",type:5,pre:0,show:")"});
+ }
+ pcounter=0;
+ bracToClose--;
+ allowed=type1;
+ asterick=type_3;
+ str.push(obj);
+ }
+ else if(cType===6){
+ if(pre.hasDec){
+ throw(new Mexp.exception("Two decimals are not allowed in one number"));
+ }
+ if(pre.type!==1){
+ pre={value:0,type:1,pre:0}; //pre needs to be changed as it will the last value now to be safe in later code
+ str.push(pre);
+ inc(ptc,-1);
+ }
+ allowed=type6;
+ inc(ptc,1);
+ asterick=empty;
+ pre.value+=cEv;
+ pre.hasDec=true;
+ }
+ else if(cType===7){
+ allowed=type1;
+ asterick=type_3;
+ inc(ptc,1);
+ str.push(obj);
+ }
+ if(cType===8){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,4).push(4);
+ str.push(obj);
+ str.push({value:"(",type:4,pre:0,show:"("});
+ }
+ else if(cType===9){
+ if(pre.type===9){
+ if(pre.value===Mexp.math.add){
+ pre.value=cEv;
+ pre.show=cShow;
+ inc(ptc,1);
+ }
+ else if(pre.value===Mexp.math.sub&&cShow==='-'){
+ pre.value=Mexp.math.add;
+ pre.show='+';
+ inc(ptc,1);
+ }
+ }
+ else if(pre.type!==5&&pre.type!==7&&pre.type!==1&&pre.type!==3&&pre.type!==13){//changesign only when negative is found
+ if(cToken==='-'){//do nothing for + token
+ //don't add with the above if statement as that will run the else statement of parent if on Ctoken +
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2).push(2);
+ str.push({value:Mexp.math.changeSign,type:0,pre:21,show:"-"});
+ str.push({value:"(",type:4,pre:0,show:"("});
+ }
+ }
+ else{
+ str.push(obj);
+ inc(ptc,2);
+ }
+ allowed=type0;
+ asterick=empty;
+ }
+ else if(cType===10){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,2);
+ str.push(obj);
+ }
+ else if(cType===11){
+ allowed=type0;
+ asterick=empty;
+ str.push(obj);
+ }
+ else if(cType===12){
+ allowed=type0;
+ asterick=empty;
+ inc(ptc,6).push(6);
+ str.push(obj);
+ str.push({value:"(",type:4,pre:0});
+ }
+ else if(cType===13){
+ allowed=type1;
+ asterick=type_3;
+ str.push(obj);
+ }
+ inc(ptc,-1);
+ prevKey=key;
+ }
+ for(var j=ptc.length;j--;){ //loop over ptc
+ if(ptc[j]===0){
+
+ str.push({value:")",show:")",type:5,pre:3});
+ inc(ptc,-1).pop();
+ }
+ }
+ if (allowed[5]!==true) {
+ throw(new Mexp.exception("complete the expression"));
+ }
+ while(bracToClose--)
+ str.push({value:")",show:")",type:5,pre:3});
+
+ str.push({type:5,value:")",show:")",pre:0});
+// console.log(str);
+ return new Mexp(str);
+ };
+ module.exports=Mexp;
diff --git a/node_modules/math-expression-evaluator/src/math_function.js b/node_modules/math-expression-evaluator/src/math_function.js
new file mode 100755
index 00000000..18d46ed6
--- /dev/null
+++ b/node_modules/math-expression-evaluator/src/math_function.js
@@ -0,0 +1,120 @@
+ var Mexp=function(parsed){
+ this.value=parsed;
+
+ };
+
+ Mexp.math={
+ isDegree:true, //mode of calculator
+ acos:function(x){
+ return (Mexp.math.isDegree?180/Math.PI*Math.acos(x):Math.acos(x));
+ },
+ add:function(a,b){
+ return a+b;
+ },
+ asin:function(x){
+ return (Mexp.math.isDegree?180/Math.PI*Math.asin(x):Math.asin(x));
+ },
+ atan:function(x){
+ return (Mexp.math.isDegree?180/Math.PI*Math.atan(x):Math.atan(x));
+ },
+ acosh:function(x){
+ return Math.log(x+Math.sqrt(x*x-1));
+ },
+ asinh:function(x){
+ return Math.log(x+Math.sqrt(x*x+1));
+ },
+ atanh:function(x){
+ return Math.log((1+x)/(1-x));
+ },
+ C:function(n,r){
+ var pro=1,other=n-r,choice=r;
+ if(choice<other){
+ choice=other;
+ other=r;
+ }
+ for(var i=choice+1;i<=n;i++)
+ pro*=i;
+ return pro/Mexp.math.fact(other);
+ },
+ changeSign:function(x){
+ return -x;
+ },
+ cos:function(x){
+ if(Mexp.math.isDegree)x=Mexp.math.toRadian(x);
+ return Math.cos(x);
+ },
+ cosh:function(x){
+ return (Math.pow(Math.E,x)+Math.pow(Math.E,-1*x))/2;
+ },
+ div:function(a,b){
+ return a/b;
+ },
+ fact:function(n) {
+ if(n%1!==0)return "NAN";
+ var pro=1;
+ for(var i=2;i<=n;i++)
+ pro*=i;
+ return pro;
+ },
+ inverse:function(x){
+ return 1/x;
+ },
+ log:function(i){
+ return Math.log(i)/Math.log(10);
+ },
+ mod:function(a,b){
+ return a%b;
+ },
+ mul:function(a,b){
+ return a*b;
+ },
+ P:function(n,r){var pro=1;
+ for(var i=Math.floor(n)-Math.floor(r)+1;i<=Math.floor(n);i++)
+ pro*=i;
+ return pro;
+
+ },
+ Pi:function(low,high,ex){
+ var pro=1;
+ for(var i=low;i<=high;i++){
+ pro*=Number(ex.postfixEval({n:i}));
+ }
+ return pro;
+ },
+ pow10x:function(e){
+ var x=1;
+ while(e--){x*=10;}
+ return x;
+ },
+ sigma:function(low,high,ex){
+ var sum=0;
+ for(var i=low;i<=high;i++){
+ sum+=Number(ex.postfixEval({n:i}));
+ }
+ return sum;
+ },
+ sin:function(x){
+ if(Mexp.math.isDegree)x=Mexp.math.toRadian(x);
+ return Math.sin(x);
+ },
+ sinh:function(x){
+ return (Math.pow(Math.E,x)-Math.pow(Math.E,-1*x))/2;
+ },
+ sub:function(a,b){
+ return a-b;
+ },
+ tan:function(x){
+ if(Mexp.math.isDegree)x=Mexp.math.toRadian(x);
+ return Math.tan(x);
+ },
+ tanh:function(x){
+ return Mexp.sinha(x)/Mexp.cosha(x);
+ },
+ toRadian:function(x){
+ return x*Math.PI/180;
+ }
+ };
+ Mexp.exception=function(message){
+ this.message=message;
+ };
+ module.exports=Mexp; \ No newline at end of file
diff --git a/node_modules/math-expression-evaluator/src/postfix.js b/node_modules/math-expression-evaluator/src/postfix.js
new file mode 100755
index 00000000..9c8dd424
--- /dev/null
+++ b/node_modules/math-expression-evaluator/src/postfix.js
@@ -0,0 +1,50 @@
+
+ var Mexp=require('./lexer.js');
+
+ Mexp.prototype.toPostfix = function () {
+ 'use strict';
+ var post=[],elem,popped,prep,pre,ele;
+ var stack=[{value:"(",type:4,pre:0}];
+ var arr=this.value;
+ for (var i=1; i < arr.length; i++) {
+ if(arr[i].type===1||arr[i].type===3||arr[i].type===13){ //if token is number,constant,or n(which is also a special constant in our case)
+ if(arr[i].type===1)
+ arr[i].value=Number(arr[i].value);
+ post.push(arr[i]);
+ }
+ else if(arr[i].type===4){
+ stack.push(arr[i]);
+ }
+ else if(arr[i].type===5){
+ while((popped=stack.pop()).type!==4){
+ post.push(popped);
+ }
+ }
+ else if(arr[i].type===11){
+ while((popped=stack.pop()).type!==4){
+ post.push(popped);
+ }
+ stack.push(popped);
+ }
+ else {
+ elem=arr[i];
+ pre=elem.pre;
+ ele=stack[stack.length-1];
+ prep=ele.pre;
+ var flag=ele.value=='Math.pow'&&elem.value=='Math.pow';
+ if(pre>prep)stack.push(elem);
+ else {
+ while(prep>=pre&&!flag||flag&&pre<prep){
+ popped=stack.pop();
+ ele=stack[stack.length-1];
+ post.push(popped);
+ prep=ele.pre;
+ flag=elem.value=='Math.pow'&&ele.value=='Math.pow';
+ }
+ stack.push(elem);
+ }
+ }
+ }
+ return new Mexp(post);
+ };
+ module.exports=Mexp; \ No newline at end of file
diff --git a/node_modules/math-expression-evaluator/src/postfix_evaluator.js b/node_modules/math-expression-evaluator/src/postfix_evaluator.js
new file mode 100755
index 00000000..3d162e46
--- /dev/null
+++ b/node_modules/math-expression-evaluator/src/postfix_evaluator.js
@@ -0,0 +1,105 @@
+var Mexp=require('./postfix.js');
+Mexp.prototype.postfixEval = function (UserDefined) {
+ 'use strict';
+ UserDefined=UserDefined||{};
+ UserDefined.PI=Math.PI;
+ UserDefined.E=Math.E;
+ var stack=[],pop1,pop2,pop3;
+ var disp=[];
+ var temp='';
+ var arr=this.value;
+ var bool=(typeof UserDefined.n!=="undefined");
+ for(var i=0;i<arr.length;i++){
+ if(arr[i].type===1){
+ stack.push({value:arr[i].value,type:1});
+ }
+ else if(arr[i].type===3){
+ stack.push({value:UserDefined[arr[i].value],type:1});
+ }
+ else if(arr[i].type===0){
+ if(typeof stack[stack.length-1].type==="undefined"){
+ stack[stack.length-1].value.push(arr[i]);
+ }
+ else stack[stack.length-1].value=arr[i].value(stack[stack.length-1].value);
+ }
+ else if(arr[i].type===7){
+ if(typeof stack[stack.length-1].type==="undefined"){
+ stack[stack.length-1].value.push(arr[i]);
+ }
+ else stack[stack.length-1].value=arr[i].value(stack[stack.length-1].value);
+ }
+ else if(arr[i].type===8){
+ pop1=stack.pop();
+ pop2=stack.pop();
+ stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
+ }
+ else if(arr[i].type===10){
+ pop1=stack.pop();
+ pop2=stack.pop();
+ if(typeof pop2.type==="undefined"){
+ pop2.value=pop2.concat(pop1);
+ pop2.value.push(arr[i]);
+ stack.push(pop2);
+ }
+ else if (typeof pop1.type==="undefined") {
+ pop1.unshift(pop2);
+ pop1.push(arr[i]);
+ stack.push(pop1);
+ }
+ else{
+ stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
+ }
+ }
+ else if(arr[i].type===2||arr[i].type===9){
+ pop1=stack.pop();
+ pop2=stack.pop();
+ if(typeof pop2.type==="undefined"){
+ console.log(pop2);
+ pop2=pop2.concat(pop1);
+ pop2.push(arr[i]);
+ stack.push(pop2);
+ }
+ else if (typeof pop1.type==="undefined") {
+ pop1.unshift(pop2);
+ pop1.push(arr[i]);
+ stack.push(pop1);
+ }
+ else{
+ stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
+ }
+ }
+ else if(arr[i].type===12){
+ pop1=stack.pop();
+ if (typeof pop1.type!=="undefined") {
+ pop1=[pop1];
+ }
+ pop2=stack.pop();
+ pop3=stack.pop();
+ stack.push({type:1,value:arr[i].value(pop3.value,pop2.value,new Mexp(pop1))});
+ }
+ else if(arr[i].type===13){
+ if(bool){
+ stack.push({value:UserDefined[arr[i].value],type:3});
+ }
+ else stack.push([arr[i]]);
+ }
+ }
+ if (stack.length>1) {
+ throw(new Mexp.exception("Uncaught Syntax error"));
+ }
+ return stack[0].value>1000000000000000?"Infinity":parseFloat(stack[0].value.toFixed(15));
+};
+Mexp.eval=function(str,tokens,obj){
+ if (typeof tokens==="undefined") {
+ return this.lex(str).toPostfix().postfixEval();
+ }
+ else if (typeof obj==="undefined") {
+ if (typeof tokens.length!=="undefined")
+ return this.lex(str,tokens).toPostfix().postfixEval();
+ else
+ return this.lex(str).toPostfix().postfixEval(tokens);
+ }
+ else
+ return this.lex(str,tokens).toPostfix().postfixEval(obj);
+};
+module.exports=Mexp; \ No newline at end of file
diff --git a/node_modules/math-expression-evaluator/test/index.js b/node_modules/math-expression-evaluator/test/index.js
new file mode 100755
index 00000000..235a30d5
--- /dev/null
+++ b/node_modules/math-expression-evaluator/test/index.js
@@ -0,0 +1,171 @@
+// This test is for node JS
+
+var assert = require('assert');
+var a=require("../src/formula_evaluator.js");
+describe('Testing Unit', function () {
+ it('should equal 2 to check a number', function () {
+ assert.equal(a.lex("2").toPostfix().postfixEval(),2);
+ });
+ it('checks a math function', function () {
+ assert.equal(a.lex("tan(180)").toPostfix().postfixEval(),0);
+ });
+ it('checks a parenthesis less function', function () {
+ assert.equal(a.lex("sin180").toPostfix().postfixEval(),0);
+ });
+ it('checks a parenthesis less function after a space', function () {
+ assert.equal(a.lex("cos 180").toPostfix().postfixEval(),-1);
+ });
+ it('checks a parenthesis less function after multiple spaces', function () {
+ assert.equal(a.lex("cos 180").toPostfix().postfixEval(),-1);
+ });
+ it('checks consecutive operator', function () {
+ assert.equal(a.lex("0+-2").toPostfix().postfixEval(),-2);
+ });
+ it('checks ^ operator', function () {
+ assert.equal(a.lex("2^2").toPostfix().postfixEval(),4);
+ });
+ it('checks when * is omitted before parenthesis and after', function () {
+ assert.equal(a.lex("2(7-4)3").toPostfix().postfixEval(),18);
+ });
+ it('checks multiplication and exponential in series', function () {
+ assert.equal(a.lex("2*7^2").toPostfix().postfixEval(),98);
+ });
+ it('checks exponential and multiplication in series', function () {
+ assert.equal(a.lex("2^5*2").toPostfix().postfixEval(),64);
+ });
+ it('-3^2=-9', function () {
+ assert.equal(a.lex("-3^2").toPostfix().postfixEval(),-9);
+ });
+ it('3^2-2^2=5', function () {
+ assert.equal(a.lex("3^2-2^2").toPostfix().postfixEval(),5);
+ });
+
+ it('formula test', function () {
+ assert.equal(a.lex("2").toPostfix().formulaEval(),2);
+ });
+ it('formula test', function () {
+ assert.equal(a.lex("sinpi").toPostfix().formulaEval(),"sin(&pi;)");
+ });
+ it('formula test', function () {
+ assert.equal(a.lex("cos pi").toPostfix().formulaEval(),"cos(&pi;)");
+ });
+ it('formula test', function () {
+ assert.equal(a.lex("tan(pi)").toPostfix().formulaEval(),"tan(&pi;)");
+ });
+ it('formula test', function () {
+ assert.equal(a.lex("2(7-4)3").toPostfix().formulaEval(),"(2&times;(7-4))&times;3");
+ });
+ it('test to check the bug when number contains decimal', function () {
+ assert.equal(a.lex("int2.3").toPostfix().postfixEval(),"2");
+ });
+ it('test to check auto correct of parenthesis mismatch if opening>closing', function () {
+ assert.equal(a.lex("(2+(3-4").toPostfix().postfixEval(),"1");
+ });
+ it('check for negative of a constant', function () {
+ assert.equal(a.lex("-e").toPostfix().postfixEval(),-Math.E);
+ });
+ it('check for constant inside Sigma', function () {
+ assert.equal(a.lex("Sigma1,3,2",[{type:3,preced:0,ev:"x",show:"x",token:"x"}]).toPostfix().postfixEval({x:2}),6);
+ });
+ it('check when arithmetic and n are present inside sigma', function () {
+ assert.equal(a.lex("Sigma1,2,n").toPostfix().postfixEval(),3);
+ });
+ it(' should check when 4C3', function () {
+ assert.equal(a.lex("4C3").toPostfix().postfixEval(),4);
+ });
+ it('check when arithmetic and n are present inside sigma', function () {
+ assert.equal(a.lex("Sigma1,2,(n*n)").toPostfix().postfixEval(),5);
+ });
+
+ it('check when two parenthesis less functions are consecutive on one parameter', function () {
+ assert.equal(a.lex("sinint2.5").toPostfix().postfixEval(),a.lex("sin(int(2.5))").toPostfix().postfixEval());
+ });
+
+ it('check eval method with single argument', function () {
+ assert.equal(a.eval("5*3"),"15");
+ });
+ it('check eval method with three argument', function () {
+ assert.equal(a.eval("mexp*3",[{type:3,show:"mexp",token:"mexp",value:"mexp",preced:0}],{mexp:5}),"15");
+ });
+ it('check eval method with two argument when second one is value of constants', function () {
+ a.addToken([{type:3,show:"mexp",value:"mexp",preced:0,token:"mexp"}]);
+ assert.equal(a.eval("mexp*3",{mexp:5}),"15");
+ });
+ it('check eval method with two argument when second one is value of constants', function () {
+ a.addToken([{type:0,show:"mexp",value:function(a){return 5*a;},preced:11,token:"mexp"}]);
+ assert.equal(a.lex("mexp3").toPostfix().postfixEval(),"15");
+ });
+ it('check eval method with two argument when second one is token list', function () {
+ assert.equal(a.eval("mexp(3)",[{type:0,show:"mexp(",value:function(a){return 5*a;},preced:11,token:"mexp"}]),"15");
+ });
+ it('Pi', function () {
+ assert.equal(a.eval("Pi1,5,n"),"120");
+ });
+ it('tan5(6+3)', function () {
+ assert.equal(a.eval("tan5(6+3)"),"1");
+ });
+ it('tan(40+5)', function () {
+ assert.equal(a.eval("tan(40+5)"),"1");
+ });
+ it('checks when a 0 is missing in a decimal number', function () {
+ assert.equal(a.eval("5*.8"),"4");
+ });
+ it('checks root function', function () {
+ assert.equal(a.eval("root4"),"2");
+ });
+ it('checks + precedence before number insise parenthesis ', function () {
+ assert.equal(a.eval("(-2)"),"-2");
+ });
+ it('checks multiple allowable operator', function () {
+ assert.equal(a.eval("2+++-++-+-+3"),"-1");
+ assert.equal(a.eval("2*+3"),"6");
+ });
+});
+describe('These expression will check for types of returned result', function () {
+ it('should tell to compllete expression', function () {
+ assert.equal(typeof a.eval('0'), 'number')
+ });
+});
+describe('These expression will raise error', function () {
+ it('should tell to compllete expression', function () {
+ try{
+ a.eval("2*")
+ }
+ catch(e){
+ assert.equal(e.message,"complete the expression")
+ }
+ });
+ it('should warn about multiple operators', function () {
+ try{
+ a.eval("2**3")
+ }
+ catch(e){
+ assert.equal(e.message,"* is not allowed after *")
+ }
+ });
+ it('should warn about multiple operators', function () {
+ try{
+ a.eval("2*Mod*3")
+ }
+ catch(e){
+ assert.equal(e.message,"Mod is not allowed after *")
+ }
+ });
+ it('should warn about operator inside parenthesis', function () {
+ try{
+ a.eval("(+)")
+ }
+ catch(e){
+ assert.equal(e.message,") is not allowed after +")
+ }
+ });
+ it('should warn about operator inside parenthesis', function () {
+ try{
+ a.eval("(+)")
+ }
+ catch(e){
+ assert.equal(e.message,") is not allowed after +")
+ }
+ });
+
+});