public function testALL() { $this->assertTrue($this->object->count() == 10); $this->assertTrue($this->object->pop()->toNative() == 9); $this->assertTrue($this->object->count() == 9); $this->object->push(1); $this->assertTrue($this->object->remove(1)); $this->object->push(78); }
private function process() { //echo "Processing postfix notation:\n\n"; $tempStack = new Stack(); while ($token = $this->rpnNotation->dequeue()) { if ($token instanceof Number) { $tempStack->push($token); } elseif ($token instanceof Operator || $token instanceof Funct) { /** @var $token Operator|Funct */ if ($tempStack->count() < $token->numOfArgs()) { throw new Exception(sprintf('Required %d arguments, %d given.', $token->numOfArgs(), $tempStack->count())); } $arg = $tempStack->popMultiple($token->numOfArgs()); $tempStack->push($token->execute(array_reverse($arg))); } } return $tempStack->pop()->value; }
/** * Vyhodnocení výrazu * * @param array * @return array */ protected function evaluateExpression(array $expr) { if ($expr[0] != 'expression') { return $this->reduceValue($expr); } array_shift($expr); //převod výrazu do postfixové notace $postfix = array(); $stack = new Stack(); foreach ($expr as $symbol) { if ($symbol == '(') { $stack->push($symbol); } elseif ($symbol == ')') { while ($top = $stack->pop()) { if ($top == '(') { break; } $postfix[] = $top; } $top = $stack->top(); if ($top[0] == 'unary' && array_key_exists($top[1], Compiler::$unaryOperators)) { $postfix[] = $stack->pop(); } } elseif ($symbol[0] == 'binary' && array_key_exists($symbol[1], Compiler::$binaryOperators)) { if ($stack->count() == 0) { $stack->push($symbol); continue; } $top = $stack->top(); while ($top != '(' && $stack->count() > 0 && $top[0] == 'binary' && Compiler::$binaryOperators[$symbol[1]] <= Compiler::$binaryOperators[$top[1]]) { $postfix[] = $stack->pop(); $top = $stack->top(); } $stack->push($symbol); } elseif ($symbol[0] == 'unary' && array_key_exists($symbol[1], Compiler::$unaryOperators)) { $stack->push($symbol); } else { $postfix[] = $this->reduceValue($symbol); $top = $stack->top(); if ($top[0] == 'unary' && array_key_exists($top[1], Compiler::$unaryOperators)) { $postfix[] = $stack->pop(); } } } while ($stack->count() > 0) { $postfix[] = $stack->pop(); } //vyhodnocení výrazu $stack->clear(); foreach ($postfix as $symbol) { if ($symbol[0] == 'unary' && array_key_exists($symbol[1], Compiler::$unaryOperators)) { if ($stack->count() < 1) { throw new CompileException("Nedostatek operandů pro unární operátor '{$symbol['1']}'"); } $symbol = $this->evaluateUnaryOperation($symbol[1], $stack->pop()); } elseif ($symbol[0] == 'binary' && array_key_exists($symbol[1], Compiler::$binaryOperators)) { if ($stack->count() < 2) { throw new CompileException("Nedostatek operandů pro binární operátor '{$symbol['1']}'"); } $value2 = $stack->pop(); $symbol = $this->evaluateBinaryOperation($symbol[1], $stack->pop(), $value2); } $stack->push($symbol); } if ($stack->count() != 1) { throw new CompileException("Výsledkem výrazu má být pouze 1 hodnota"); } return $stack->pop(); }