Esempio n. 1
0
 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);
 }
Esempio n. 2
0
File: onp.php Progetto: rn0/php-calc
 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;
 }
Esempio n. 3
0
 /**
  * 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();
 }