937a90286f6fd1a2f351248a75eefa15f9cd03e9986758c4b840ca33aebd7be02091d376ce3688f777acbb0a600d206dd8e782f1c0db681b41c7bbfcd206ec 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;