summaryrefslogtreecommitdiff
path: root/node_modules/math-expression-evaluator/src/postfix_evaluator.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/math-expression-evaluator/src/postfix_evaluator.js')
-rw-r--r--node_modules/math-expression-evaluator/src/postfix_evaluator.js89
1 files changed, 89 insertions, 0 deletions
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 100644
index 00000000..037aa889
--- /dev/null
+++ b/node_modules/math-expression-evaluator/src/postfix_evaluator.js
@@ -0,0 +1,89 @@
+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) {
+ 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