orionsoft-react-scripts
Version:
Orionsoft Configuration and scripts for Create React App.
970 lines (934 loc) • 27.1 kB
JavaScript
/** math-expression-evaluator version 1.2.14
Dated:2016-08-25 */
(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){
/**
* lodash (Custom Build) <https://lodash.com/>
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
MAX_INTEGER = 1.7976931348623157e+308,
NAN = 0 / 0;
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;
/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;
/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;
/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;
/**
* The base implementation of `_.findIndex` and `_.findLastIndex` without
* support for iteratee shorthands.
*
* @private
* @param {Array} array The array to inspect.
* @param {Function} predicate The function invoked per iteration.
* @param {number} fromIndex The index to search from.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseFindIndex(array, predicate, fromIndex, fromRight) {
var length = array.length,
index = fromIndex + (fromRight ? 1 : -1);
while ((fromRight ? index-- : ++index < length)) {
if (predicate(array[index], index, array)) {
return index;
}
}
return -1;
}
/**
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} value The value to search for.
* @param {number} fromIndex The index to search from.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseIndexOf(array, value, fromIndex) {
if (value !== value) {
return baseFindIndex(array, baseIsNaN, fromIndex);
}
var index = fromIndex - 1,
length = array.length;
while (++index < length) {
if (array[index] === value) {
return index;
}
}
return -1;
}
/**
* The base implementation of `_.isNaN` without support for number objects.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
*/
function baseIsNaN(value) {
return value !== value;
}
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* Gets the index at which the first occurrence of `value` is found in `array`
* using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
* for equality comparisons. If `fromIndex` is negative, it's used as the
* offset from the end of `array`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Array
* @param {Array} array The array to inspect.
* @param {*} value The value to search for.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the matched value, else `-1`.
* @example
*
* _.indexOf([1, 2, 1, 2], 2);
* // => 1
*
* // Search from the `fromIndex`.
* _.indexOf([1, 2, 1, 2], 2, 2);
* // => 3
*/
function indexOf(array, value, fromIndex) {
var length = array ? array.length : 0;
if (!length) {
return -1;
}
var index = fromIndex == null ? 0 : toInteger(fromIndex);
if (index < 0) {
index = nativeMax(length + index, 0);
}
return baseIndexOf(array, value, index);
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return !!value && typeof value == 'object';
}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value == 'symbol' ||
(isObjectLike(value) && objectToString.call(value) == symbolTag);
}
/**
* Converts `value` to a finite number.
*
* @static
* @memberOf _
* @since 4.12.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted number.
* @example
*
* _.toFinite(3.2);
* // => 3.2
*
* _.toFinite(Number.MIN_VALUE);
* // => 5e-324
*
* _.toFinite(Infinity);
* // => 1.7976931348623157e+308
*
* _.toFinite('3.2');
* // => 3.2
*/
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0;
}
value = toNumber(value);
if (value === INFINITY || value === -INFINITY) {
var sign = (value < 0 ? -1 : 1);
return sign * MAX_INTEGER;
}
return value === value ? value : 0;
}
/**
* Converts `value` to an integer.
*
* **Note:** This method is loosely based on
* [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted integer.
* @example
*
* _.toInteger(3.2);
* // => 3
*
* _.toInteger(Number.MIN_VALUE);
* // => 0
*
* _.toInteger(Infinity);
* // => 1.7976931348623157e+308
*
* _.toInteger('3.2');
* // => 3
*/
function toInteger(value) {
var result = toFinite(value),
remainder = result % 1;
return result === result ? (remainder ? result - remainder : result) : 0;
}
/**
* Converts `value` to a number.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {number} Returns the number.
* @example
*
* _.toNumber(3.2);
* // => 3.2
*
* _.toNumber(Number.MIN_VALUE);
* // => 5e-324
*
* _.toNumber(Infinity);
* // => Infinity
*
* _.toNumber('3.2');
* // => 3.2
*/
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
value = isObject(other) ? (other + '') : other;
}
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
return (isBinary || reIsOctal.test(value))
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: (reIsBadHex.test(value) ? NAN : +value);
}
module.exports = indexOf;
},{}],2:[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":6}],3:[function(require,module,exports){
var Mexp=require('./math_function.js');
var indexOf = require('lodash.indexof');
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','π','(',')','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','.','+','-',',','Σ','n','Π','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=indexOf(token,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=indexOf(token,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(indexOf([0,2,3,5,9,11,12,13], 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="×";
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":4,"lodash.indexof":1}],4:[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;
},{}],5:[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":3}],6:[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":Number(stack[0].value.toFixed(15)).toPrecision();
};
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":5}]},{},[2])(2)
});