(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["Mexp"] = factory(); else root["Mexp"] = factory(); })(self, function() { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 28: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Mexp=__webpack_require__(733); Mexp.prototype.formulaEval = function () { "use strict"; var stack=[],pop1,pop2,pop3; var disp=[]; var temp=''; var arr=this.value; for(var i=0;i"+pop2.value+""+arr[i].show+""+pop1.value+"",type:10}); else disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+""+pop1.value+"",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; /***/ }), /***/ 618: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var Mexp = __webpack_require__(178) function inc(arr, val) { for (var i = 0; i < arr.length; i++) { arr[i] += val } return arr } var tokens = [ { token: 'sin', show: 'sin', type: 0, value: Mexp.math.sin }, { token: 'cos', show: 'cos', type: 0, value: Mexp.math.cos }, { token: 'tan', show: 'tan', type: 0, value: Mexp.math.tan }, { token: 'pi', show: 'π', type: 3, value: 'PI' }, { token: '(', show: '(', type: 4, value: '(' }, { token: ')', show: ')', type: 5, value: ')' }, { token: 'P', show: 'P', type: 10, value: Mexp.math.P }, { token: 'C', show: 'C', type: 10, value: Mexp.math.C }, { token: ' ', show: ' ', type: 14, value: ' '.anchor }, { token: 'asin', show: 'asin', type: 0, value: Mexp.math.asin }, { token: 'acos', show: 'acos', type: 0, value: Mexp.math.acos }, { token: 'atan', show: 'atan', type: 0, value: Mexp.math.atan }, { token: '7', show: '7', type: 1, value: '7' }, { token: '8', show: '8', type: 1, value: '8' }, { token: '9', show: '9', type: 1, value: '9' }, { token: 'int', show: 'Int', type: 0, value: Math.floor }, { token: 'cosh', show: 'cosh', type: 0, value: Mexp.math.cosh }, { token: 'acosh', show: 'acosh', type: 0, value: Mexp.math.acosh }, { token: 'ln', show: ' ln', type: 0, value: Math.log }, { token: '^', show: '^', type: 10, value: Math.pow }, { token: 'root', show: 'root', type: 0, value: Math.sqrt }, { token: '4', show: '4', type: 1, value: '4' }, { token: '5', show: '5', type: 1, value: '5' }, { token: '6', show: '6', type: 1, value: '6' }, { token: '/', show: '÷', type: 2, value: Mexp.math.div }, { token: '!', show: '!', type: 7, value: Mexp.math.fact }, { token: 'tanh', show: 'tanh', type: 0, value: Mexp.math.tanh }, { token: 'atanh', show: 'atanh', type: 0, value: Mexp.math.atanh }, { token: 'Mod', show: ' Mod ', type: 2, value: Mexp.math.mod }, { token: '1', show: '1', type: 1, value: '1' }, { token: '2', show: '2', type: 1, value: '2' }, { token: '3', show: '3', type: 1, value: '3' }, { token: '*', show: '×', type: 2, value: Mexp.math.mul }, { token: 'sinh', show: 'sinh', type: 0, value: Mexp.math.sinh }, { token: 'asinh', show: 'asinh', type: 0, value: Mexp.math.asinh }, { token: 'e', show: 'e', type: 3, value: 'E' }, { token: 'log', show: ' log', type: 0, value: Mexp.math.log }, { token: '0', show: '0', type: 1, value: '0' }, { token: '.', show: '.', type: 6, value: '.' }, { token: '+', show: '+', type: 9, value: Mexp.math.add }, { token: '-', show: '-', type: 9, value: Mexp.math.sub }, { token: ',', show: ',', type: 11, value: ',' }, { token: 'Sigma', show: 'Σ', type: 12, value: Mexp.math.sigma }, { token: 'n', show: 'n', type: 13, value: 'n' }, { token: 'Pi', show: 'Π', type: 12, value: Mexp.math.Pi }, { token: 'pow', show: 'pow', type: 8, value: Math.pow, numberOfArguments: 2 }, { token: '&', show: '&', type: 9, value: Mexp.math.and }, ] 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, 14: -1, 15: 11, // will be filtered after lexer } // stores precedence by types for (var i = 0; i < tokens.length; i++) { tokens[i].precedence = preced[tokens[i].type] } var type0 = { 0: true, 1: true, 3: true, 4: true, 6: true, 8: true, 9: true, 12: true, 13: true, 14: true, 15: true, } // type2:true,type4:true,type9:true,type11:true,type21:true,type22 var 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, 15: true, } // type3:true,type5:true,type7:true,type23 var type1Asterick = { 0: true, 3: true, 4: true, 8: true, 12: true, 13: true, 15: true, } var empty = {} var type3Asterick = { 0: true, 1: true, 3: true, 4: true, 6: true, 8: true, 12: true, 13: true, 15: true, } // type_5:true,type_7:true,type_23 var type6 = { 1: true, } var 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.tokenTypes = { FUNCTION_WITH_ONE_ARG: 0, NUMBER: 1, BINARY_OPERATOR_HIGH_PRECENDENCE: 2, CONSTANT: 3, OPENING_PARENTHESIS: 4, CLOSING_PARENTHESIS: 5, DECIMAL: 6, POSTFIX_FUNCTION_WITH_ONE_ARG: 7, FUNCTION_WITH_N_ARGS: 8, BINARY_OPERATOR_LOW_PRECENDENCE: 9, BINARY_OPERATOR_PERMUTATION: 10, COMMA: 11, EVALUATED_FUNCTION: 12, EVALUATED_FUNCTION_PARAMETER: 13, SPACE: 14, } /** 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 and third parameter is a string that will be mexp string 13: variable of Sigma function */ Mexp.addToken = function (newTokens) { for (var i = 0; i < newTokens.length; i++) { var x = newTokens[i].token.length var temp = -1 if (newTokens[i].type === Mexp.tokenTypes.FUNCTION_WITH_N_ARGS && newTokens[i].numberOfArguments === undefined) { newTokens[i].numberOfArguments = 2 } // newAr is a specially designed data structure index of 1d array = length of tokens newAr[x] = newAr[x] || [] for (var y = 0; y < newAr[x].length; y++) { if (newTokens[i].token === newAr[x][y]) { temp = indexOfToken(newAr[x][y], tokens) break } } if (temp === -1) { tokens.push(newTokens[i]) newTokens[i].precedence = preced[newTokens[i].type] if (newAr.length <= newTokens[i].token.length) { newAr[newTokens[i].token.length] = [] } newAr[newTokens[i].token.length].push(newTokens[i].token) } else { // overwrite tokens[temp] = newTokens[i] newTokens[i].precedence = preced[newTokens[i].type] } } } function indexOfToken(key, tokens) { for (var search = 0; search < tokens.length; search++) { if (tokens[search].token === key) return search } return -1 } function tokenize(string) { var nodes = [] var length = string.length var key, x, y for (var i = 0; i < length; i++) { if (i < length - 1 && string[i] === ' ' && string[i + 1] === ' ') { continue } key = '' for (x = string.length - i > newAr.length - 2 ? newAr.length - 1 : string.length - i; x > 0; x--) { if (newAr[x] === undefined) continue for (y = 0; y < newAr[x].length; y++) { if (match(string, newAr[x][y], i, x)) { key = newAr[x][y] y = newAr[x].length x = 0 } } } i += key.length - 1 if (key === '') { throw new Mexp.Exception("Can't understand after " + string.slice(i)) } nodes.push(tokens[indexOfToken(key, tokens)]) } return nodes } var changeSignObj = { value: Mexp.math.changeSign, type: 0, pre: 21, show: '-', } var closingParObj = { value: ')', show: ')', type: 5, pre: 0, } var openingParObj = { value: '(', type: 4, pre: 0, show: '(', } Mexp.lex = function (inp, tokens) { 'use strict' var str = [openingParObj] var ptc = [] // Parenthesis to close at the beginning is after one token var inpStr = inp var allowed = type0 var bracToClose = 0 var asterick = empty var prevKey = '' var i if (typeof tokens !== 'undefined') { Mexp.addToken(tokens) } var obj = {} var nodes = tokenize(inpStr) for (i = 0; i < nodes.length; i++) { var node = nodes[i] if (node.type === 14) { if ( i > 0 && i < nodes.length - 1 && nodes[i + 1].type === 1 && (nodes[i - 1].type === 1 || nodes[i - 1].type === 6) ) { throw new Mexp.Exception('Unexpected Space') } continue } var cToken = node.token var cType = node.type var cEv = node.value var cPre = node.precedence var cShow = node.show var pre = str[str.length - 1] var j for (j = ptc.length; j--; ) { // loop over ptc if (ptc[j] === 0) { if ([0, 2, 3, 4, 5, 9, 11, 12, 13].indexOf(cType) !== -1) { if (allowed[cType] !== true) { throw new Mexp.Exception(cToken + ' is not allowed after ' + prevKey) } str.push(closingParObj) allowed = type1 asterick = type3Asterick ptc.pop() } } else break } if (allowed[cType] !== true) { throw new Mexp.Exception(cToken + ' is not allowed after ' + prevKey) } if (asterick[cType] === true) { cType = 2 cEv = Mexp.math.mul cShow = '×' cPre = 3 i = i - 1 } obj = { value: cEv, type: cType, pre: cPre, show: cShow, numberOfArguments: node.numberOfArguments, } if (cType === 0) { allowed = type0 asterick = empty inc(ptc, 2) str.push(obj) if (nodes[i + 1].type !== 4) { str.push(openingParObj) ptc.push(2) } // bracToClose++ } else if (cType === 1) { if (pre.type === 1) { pre.value += cEv inc(ptc, 1) } else { str.push(obj) } allowed = type1 asterick = type1Asterick } 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 = type3Asterick } else if (cType === 4) { inc(ptc, 1) 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!!!') } bracToClose-- allowed = type1 asterick = type3Asterick str.push(obj) inc(ptc, 1) } 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 = type3Asterick inc(ptc, 1) str.push(obj) } if (cType === 8) { allowed = type0 asterick = empty inc(ptc, node.numberOfArguments + 2) str.push(obj) // str.push(openingParObj) if (nodes[i + 1].type !== 4) { str.push(openingParObj) ptc.push(node.numberOfArguments + 2) } } 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(changeSignObj) str.push(openingParObj) } } 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) str.push(obj) if (nodes[i + 1].type !== 4) { str.push(openingParObj) ptc.push(6) } } else if (cType === 13) { allowed = type1 asterick = type3Asterick str.push(obj) } inc(ptc, -1) prevKey = cToken } for (j = ptc.length; j--; ) { // loop over ptc str.push(closingParObj) } if (allowed[5] !== true) { throw new Mexp.Exception('complete the expression') } while (bracToClose--) { str.push(closingParObj) } str.push(closingParObj) // console.log(str); return new Mexp(str) } module.exports = Mexp /***/ }), /***/ 178: /***/ ((module) => { "use strict"; 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 var other = n - r var 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 }, and: function (a, b) { return a & b } } Mexp.Exception = function (message) { this.message = message } module.exports = Mexp /***/ }), /***/ 477: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Mexp = __webpack_require__(618); 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; /***/ }), /***/ 733: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Mexp = __webpack_require__(477) 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) { var popped = [] for (var x = 0; x < arr[i].numberOfArguments; x++) { popped.push(stack.pop().value) } stack.push({ type: 1, value: arr[i].value.apply(arr[i], popped.reverse()) }) } 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') { 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 /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __webpack_exports__ = __webpack_require__(28); /******/ /******/ return __webpack_exports__; /******/ })() ; });