postfix_evaluator.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. var Mexp=require('./postfix.js');
  2. Mexp.prototype.postfixEval = function (UserDefined) {
  3. 'use strict';
  4. UserDefined=UserDefined||{};
  5. UserDefined.PI=Math.PI;
  6. UserDefined.E=Math.E;
  7. var stack=[],pop1,pop2,pop3;
  8. var disp=[];
  9. var temp='';
  10. var arr=this.value;
  11. var bool=(typeof UserDefined.n!=="undefined");
  12. for(var i=0;i<arr.length;i++){
  13. if(arr[i].type===1){
  14. stack.push({value:arr[i].value,type:1});
  15. }
  16. else if(arr[i].type===3){
  17. stack.push({value:UserDefined[arr[i].value],type:1});
  18. }
  19. else if(arr[i].type===0){
  20. if(typeof stack[stack.length-1].type==="undefined"){
  21. stack[stack.length-1].value.push(arr[i]);
  22. }
  23. else stack[stack.length-1].value=arr[i].value(stack[stack.length-1].value);
  24. }
  25. else if(arr[i].type===7){
  26. if(typeof stack[stack.length-1].type==="undefined"){
  27. stack[stack.length-1].value.push(arr[i]);
  28. }
  29. else stack[stack.length-1].value=arr[i].value(stack[stack.length-1].value);
  30. }
  31. else if(arr[i].type===8){
  32. pop1=stack.pop();
  33. pop2=stack.pop();
  34. stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
  35. }
  36. else if(arr[i].type===10){
  37. pop1=stack.pop();
  38. pop2=stack.pop();
  39. if(typeof pop2.type==="undefined"){
  40. pop2.value=pop2.concat(pop1);
  41. pop2.value.push(arr[i]);
  42. stack.push(pop2);
  43. }
  44. else if (typeof pop1.type==="undefined") {
  45. pop1.unshift(pop2);
  46. pop1.push(arr[i]);
  47. stack.push(pop1);
  48. }
  49. else{
  50. stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
  51. }
  52. }
  53. else if(arr[i].type===2||arr[i].type===9){
  54. pop1=stack.pop();
  55. pop2=stack.pop();
  56. if(typeof pop2.type==="undefined"){
  57. console.log(pop2);
  58. pop2=pop2.concat(pop1);
  59. pop2.push(arr[i]);
  60. stack.push(pop2);
  61. }
  62. else if (typeof pop1.type==="undefined") {
  63. pop1.unshift(pop2);
  64. pop1.push(arr[i]);
  65. stack.push(pop1);
  66. }
  67. else{
  68. stack.push({type:1,value:arr[i].value(pop2.value,pop1.value)});
  69. }
  70. }
  71. else if(arr[i].type===12){
  72. pop1=stack.pop();
  73. if (typeof pop1.type!=="undefined") {
  74. pop1=[pop1];
  75. }
  76. pop2=stack.pop();
  77. pop3=stack.pop();
  78. stack.push({type:1,value:arr[i].value(pop3.value,pop2.value,new Mexp(pop1))});
  79. }
  80. else if(arr[i].type===13){
  81. if(bool){
  82. stack.push({value:UserDefined[arr[i].value],type:3});
  83. }
  84. else stack.push([arr[i]]);
  85. }
  86. }
  87. if (stack.length>1) {
  88. throw(new Mexp.exception("Uncaught Syntax error"));
  89. }
  90. return stack[0].value>1000000000000000?"Infinity":parseFloat(stack[0].value.toFixed(15));
  91. };
  92. Mexp.eval=function(str,tokens,obj){
  93. if (typeof tokens==="undefined") {
  94. return this.lex(str).toPostfix().postfixEval();
  95. }
  96. else if (typeof obj==="undefined") {
  97. if (typeof tokens.length!=="undefined")
  98. return this.lex(str,tokens).toPostfix().postfixEval();
  99. else
  100. return this.lex(str).toPostfix().postfixEval(tokens);
  101. }
  102. else
  103. return this.lex(str,tokens).toPostfix().postfixEval(obj);
  104. };
  105. module.exports=Mexp;