protected void pushOperator(Lexeme op) { if (!op.IsOperator()) { throw new ParseException("Cannot push a non-operator token onto the operator stack!"); } if (op.IsRightAssociative()) { // pushing a right-associative operator // pop the top of the stack into the output queue as long as it isn't // an opening parenthesis or its precedence is lower or equal to that of // the operator being pushed onto the stack try { while (true) { Lexeme stackTop = operatorStack.Peek(); if (stackTop.Type == Lexeme.LexemeType.LEFT_PAREN) { break; } else if (stackTop.IsHigherPrecedenceThan(op)) { output.Enqueue(stackTop); operatorStack.Pop(); } else { break; } } } catch (InvalidOperationException ex) { // operator stack is empty, continue with pushing operator } lastProcessedElement = op; operatorStack.Push(op); } else { // pushing a left-associative operator // pop the top of the stack into the output queue as long as it isn't // an opening parenthesis or its precedence is lower to that of // the operator being pushed onto the stack try { while (true) { Lexeme stackTop = operatorStack.Peek(); if (stackTop.Type == Lexeme.LexemeType.LEFT_PAREN) { break; } else if (!stackTop.IsLowerPrecedenceThan(op)) { output.Enqueue(stackTop); operatorStack.Pop(); } else { break; } } } catch (InvalidOperationException ex) { // operator stack is empty, continue with pushing operator } lastProcessedElement = op; operatorStack.Push(op); } }