Blame view

node_modules/math-expression-evaluator/src/postfix.js 1.24 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;