postfix.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. var Mexp=require('./lexer.js');
  2. Mexp.prototype.toPostfix = function () {
  3. 'use strict';
  4. var post=[],elem,popped,prep,pre,ele;
  5. var stack=[{value:"(",type:4,pre:0}];
  6. var arr=this.value;
  7. for (var i=1; i < arr.length; i++) {
  8. 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)
  9. if(arr[i].type===1)
  10. arr[i].value=Number(arr[i].value);
  11. post.push(arr[i]);
  12. }
  13. else if(arr[i].type===4){
  14. stack.push(arr[i]);
  15. }
  16. else if(arr[i].type===5){
  17. while((popped=stack.pop()).type!==4){
  18. post.push(popped);
  19. }
  20. }
  21. else if(arr[i].type===11){
  22. while((popped=stack.pop()).type!==4){
  23. post.push(popped);
  24. }
  25. stack.push(popped);
  26. }
  27. else {
  28. elem=arr[i];
  29. pre=elem.pre;
  30. ele=stack[stack.length-1];
  31. prep=ele.pre;
  32. var flag=ele.value=='Math.pow'&&elem.value=='Math.pow';
  33. if(pre>prep)stack.push(elem);
  34. else {
  35. while(prep>=pre&&!flag||flag&&pre<prep){
  36. popped=stack.pop();
  37. ele=stack[stack.length-1];
  38. post.push(popped);
  39. prep=ele.pre;
  40. flag=elem.value=='Math.pow'&&ele.value=='Math.pow';
  41. }
  42. stack.push(elem);
  43. }
  44. }
  45. }
  46. return new Mexp(post);
  47. };
  48. module.exports=Mexp;