public function __construct($data) { $nodeLeft = $data['nodeLeft']; $nodeRight = $data['nodeRight']; if ($nodeLeft || $nodeRight) { if ($nodeRight && $nodeRight->type == N_OR) { if (!$nodeLeft || $nodeRight->left && $nodeRight->left->min > $nodeLeft->min) { $newNodeLeft = $nodeRight->left; $nodeRight = nodeFactory::createNode(N_OR, array('nodeLeft' => $nodeLeft, 'nodeRight' => $nodeRight->right)); $nodeLeft = $newNodeLeft; } } $this->greedy = $data['greedy']; $this->req = $nodeLeft->req & $nodeRight->req; if (!$nodeLeft || $nodeRight && $nodeRight->min > $nodeLeft->min) { $this->min = $nodeLeft ? $nodeLeft->min : 0; $this->max = !$nodeRight->max ? $nodeRight->max : max($nodeRight->max, $nodeLeft->max); $this->size = max($nodeRight->size, $nodeLeft->size); $this->left = $nodeRight; $this->right = $nodeLeft; } else { if (!$nodeRight || $nodeLeft && $nodeLeft->min >= $nodeRight->min) { $this->min = $nodeRight ? $nodeRight->min : 0; $this->max = !$nodeLeft->max ? $nodeLeft->max : max($nodeRight->max, $nodeLeft->max); $this->size = max($nodeRight->size, $nodeLeft->size); $this->left = $nodeLeft; $this->right = $nodeRight; } } } }
public function parseRepeat(&$prevNode, $stack) { switch ($this->scanner->token_ahead) { case T_REP_ZERO_ONE: $this->scanner->next(); $prevNode->req = false; $node = $this->parseRepeat($prevNode, $stack); break; case T_REP_ZERO_MORE: $this->scanner->next(); $node = nodeFactory::createNode(N_REPEAT, array("greedy" => $prevNode->greedy, "minRep" => 1, "maxRep" => 0, "req" => false, "min" => $prevNode->min, "max" => 0, "size" => $prevNode->size, "nodeLeft" => $prevNode)); $node = $this->parseRepeat($node, $stack); break; case T_REP_ONE_MORE: $this->scanner->next(); $node = nodeFactory::createNode(N_REPEAT, array("greedy" => $prevNode->greedy, "minRep" => 1, "maxRep" => 0, "req" => $prevNode->req, "min" => $prevNode->min, "max" => 0, "size" => $prevNode->size, "nodeLeft" => $prevNode)); $node = $this->parseRepeat($node, $stack); break; case T_REP_OPEN: $this->scanner->next(); $min = 0; $max = 0; if ($this->scanner->token_ahead == T_NUMBER) { $this->scanner->next(); $min = (int) $this->scanner->token_value; $max = $min; } if ($this->scanner->token_ahead == T_COMMA) { $this->scanner->next(); if ($this->scanner->token_ahead == T_NUMBER) { $this->scanner->next(); $max = (int) $this->scanner->token_value; } } if ($this->scanner->token_ahead == T_REP_CLOSE) { $this->scanner->next(); } $node = nodeFactory::createNode(N_REPEAT, array("greedy" => $prevNode->greedy, "minRep" => $min > 0 ? $min : 1, "maxRep" => $max, "req" => $min > 0 ? $prevNode->req : false, "min" => $min > 0 ? $min * $prevNode->min : $prevNode->min, "max" => $max * $prevNode->max, "size" => $min ? $min * $prevNode->size : $prevNode->size, "nodeLeft" => $prevNode)); $node = $this->parseRepeat($node, $stack); break; default: $node = $prevNode; break; } return $node; }