aboutsummaryrefslogtreecommitdiff
path: root/node_modules/math-expression-evaluator/src/postfix.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/math-expression-evaluator/src/postfix.js')
-rwxr-xr-xnode_modules/math-expression-evaluator/src/postfix.js50
1 files changed, 50 insertions, 0 deletions
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