1  /*
     2   * Copyright the original author or authors.
     3   * 
     4   * Licensed under the MOZILLA PUBLIC LICENSE, Version 1.1 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   * 
     8   *      http://www.mozilla.org/MPL/MPL-1.1.html
     9   * 
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  import org.as2lib.regexp.node.Node; 
    18  import org.as2lib.regexp.node.TreeInfo;
    19  
    20  /**
    21   * {@code Conditional} is a node class that matches a Condition category.
    22   * 
    23   * @author Igor Sadovskiy
    24   */
    25  
    26  class org.as2lib.regexp.node.Conditional extends Node {
    27  	
    28      private var cond, yes, nope:Node;
    29      
    30      public function Conditional(cond:Node, yes:Node, nope:Node) {
    31          this.cond = cond;
    32          this.yes = yes;
    33          this.nope = nope;
    34      }
    35      
    36      public function match(matcher:Object, i:Number, seq:String):Boolean {
    37          if (cond.match(matcher, i, seq)) {
    38              return yes.match(matcher, i, seq);
    39          } else {
    40              return nope.match(matcher, i, seq);
    41          }
    42      }
    43      
    44      public function study(info:TreeInfo):Boolean {
    45          var minL:Number = info.minLength;
    46          var maxL:Number = info.maxLength;
    47          var maxV:Boolean = info.maxValid;
    48          info.reset();
    49          yes.study(info);
    50  
    51          var minL2:Number = info.minLength;
    52          var maxL2:Number = info.maxLength;
    53          var maxV2:Boolean = info.maxValid;
    54          info.reset();
    55          nope.study(info);
    56  
    57          info.minLength = minL + Math.min(minL2, info.minLength);
    58          info.maxLength = maxL + Math.max(maxL2, info.maxLength);
    59          info.maxValid = (maxV && maxV2 && info.maxValid);
    60          info.deterministic = false;
    61          return next.study(info);
    62      }
    63  }
    64  
    65