gregswindle/jsrules

View on GitHub
lib/rpn.js

Summary

Maintainability
A
0 mins
Test Coverage
/*
'use strict';
var rpn, Operator;

Operator = require('./operator');

String.prototype.isNumeric = function() {
    return !isNaN(parseFloat(this)) && isFinite(this);
};

Array.prototype.clean = function() {
    for(var i = 0; i < this.length; i++) {
        if(this[i] === '') {
            this.splice(i, 1);
        }
    }
    return this;
};

function toRpn(infixedExpression) {
  var outputQueue = '';
  var operatorStack = [];
  var operators = {
    NOT: {
        precedence: 5,
        associativity: 'Right'
    },
    LESSTHAN: {
        precedence: 4,
        associativity: 'Left'
    },
    LESSTHANOREQUALTO: {
        precedence: 4,
        associativity: 'Left'
    },
    GREATERTHAN: {
        precedence: 4,
        associativity: 'Left'
    },
    GREATERTHANOREQUALTO: {
        precedence: 4,
        associativity: 'Left'
    },
    EQUALTO: {
        precedence: 3,
        associativity: 'Left'
    },
    NOTEQUALTO: {
        precedence: 3,
        associativity: 'Left'
    },
    AND: {
        precedence: 2,
        associativity: 'Left'
    },
    OR: {
        precedence: 2,
        associativity: 'Left'
    },
    XOR: {
        precedence: 2,
        associativity: 'Left'
    }
  };
  infixedExpression = infixedExpression.split(/\s+/igm);
    //.replace(/\s+/g, ' ')
    //.split(/([\+\-\*\/\^\(\)])/).clean();
  for(var i = 0; i < infixedExpression.length; i++) {
      var token = infixedExpression[i];
      if(token.isNumeric()) {
          outputQueue += token + ' ';
      }
      else if('^* /+-'.indexOf(token) !== -1) {
          var o1 = token;
          var o2 = operatorStack[operatorStack.length - 1];
          while('^* /+-'.indexOf(o2) !== -1 && ((operators[o1].associativity === 'Left' && operators[o1].precedence <= operators[o2].precedence) || (operators[o1].associativity === 'Right' && operators[o1].precedence < operators[o2].precedence))) {
              outputQueue += operatorStack.pop() + ' ';
              o2 = operatorStack[operatorStack.length - 1];
          }
          operatorStack.push(o1);
      }
      else if(token === '(') {
          operatorStack.push(token);
      }
      else if(token === ')') {
          while(operatorStack[operatorStack.length - 1] !== '(') {
              outputQueue += operatorStack.pop() + ' ';
          }
          operatorStack.pop();
      }
  }
  while(operatorStack.length > 0) {
      outputQueue += operatorStack.pop() + ' ';
  }
  return outputQueue;
}

rpn = {
  // https://en.wikipedia.org/wiki/Shunting-yard_algorithm
  toReversePolishNotation: toRpn,
  toRpn: toRpn
};

module.exports = rpn;
*/