/**
  * @param array $nodes
  *
  * @return array
  */
 public function create($nodes)
 {
     if ($nodes['type'] == 'group') {
         foreach ($nodes['nodes'] as $key => $child) {
             $nodes['nodes'][$key] = $this->create($child);
         }
         foreach ($this->operators as $next_operator) {
             do {
                 $index = -1;
                 for ($i = 0; $i < count($nodes['nodes']); $i++) {
                     if (!is_object($nodes['nodes'][$i]) && $nodes['nodes'][$i]['type'] == 'operator' && $nodes['nodes'][$i]['value'] == $next_operator) {
                         $index = $i;
                         break;
                     }
                 }
                 if ($index >= 0) {
                     $operation_manufacture = ilAssLacOperationManufacturer::_getInstance();
                     $operator = $operation_manufacture->manufacture($nodes['nodes'][$index]['value']);
                     $operator->setNegated($nodes["negated"]);
                     $operator->addNode($this->getExpression($nodes, $index - 1));
                     $operator->addNode($this->getExpression($nodes, $index + 1));
                     $new_nodes = array_slice($nodes['nodes'], 0, $index - 1);
                     $new_nodes[] = $operator;
                     $nodes['nodes'] = array_merge($new_nodes, array_slice($nodes['nodes'], $index + 2));
                 }
             } while ($index >= 0);
         }
         return $nodes['nodes'][0];
     }
     return $nodes;
 }
 /**
  * Cannonicalize the condition into a more general form. <br />
  * It replaces all expression with "n" and all orperators with "o" <br />
  * so that the result of an condition after cannonicalization could be:<br />
  * <br />
  * (n o n) o (n o n) o n
  */
 protected function cannonicalizeCondition()
 {
     $manufacturer = ilAssLacExpressionManufacturer::_getInstance();
     $this->condition = preg_replace($manufacturer->getPattern(), 'n', $this->condition);
     $manufacturer = ilAssLacOperationManufacturer::_getInstance();
     $this->condition = preg_replace($manufacturer->getPattern(), 'o', $this->condition);
     $this->condition = preg_replace("/no/", "n o", $this->condition);
     $this->condition = preg_replace("/on/", "o n", $this->condition);
     for ($i = 0; $i < strlen($this->condition); $i++) {
         if ($this->condition[$i] == "!" && !$this->isNegationSurroundedByBrackets($i)) {
             $this->surroundNegationExpression($i);
         }
     }
 }