示例#1
0
文件: nodes.php 项目: poef/ariadne
 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;
             }
         }
     }
 }
示例#2
0
文件: parser.php 项目: poef/ariadne
 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;
 }