| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- 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;
|