1<?php 2 3/** 4 * Hoa 5 * 6 * 7 * @license 8 * 9 * New BSD License 10 * 11 * Copyright © 2007-2017, Hoa community. All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions are met: 15 * * Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * * Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * * Neither the name of the Hoa nor the names of its contributors may be 21 * used to endorse or promote products derived from this software without 22 * specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE 28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37namespace Hoa\Compiler\Llk\Rule; 38 39use Hoa\Compiler; 40 41/** 42 * Class \Hoa\Compiler\Llk\Rule\Repetition. 43 * 44 * The repetition rule. 45 * 46 * @copyright Copyright © 2007-2017 Hoa community 47 * @license New BSD License 48 */ 49class Repetition extends Rule 50{ 51 /** 52 * Minimum bound. 53 * 54 * @var int 55 */ 56 protected $_min = 0; 57 58 /** 59 * Maximum bound. 60 * 61 * @var int 62 */ 63 protected $_max = 0; 64 65 66 67 /** 68 * Constructor. 69 * 70 * @param string $name Name. 71 * @param int $min Minimum bound. 72 * @param int $max Maximum bound. 73 * @param mixed $children Children. 74 * @param string $nodeId Node ID. 75 */ 76 public function __construct($name, $min, $max, $children, $nodeId) 77 { 78 parent::__construct($name, $children, $nodeId); 79 80 $min = max(0, (int) $min); 81 $max = max(-1, (int) $max); 82 83 if (-1 !== $max && $min > $max) { 84 throw new Compiler\Exception\Rule( 85 'Cannot repeat with a min (%d) greater than max (%d).', 86 0, 87 [$min, $max] 88 ); 89 } 90 91 $this->_min = $min; 92 $this->_max = $max; 93 94 return; 95 } 96 97 /** 98 * Get minimum bound. 99 * 100 * @return int 101 */ 102 public function getMin() 103 { 104 return $this->_min; 105 } 106 107 /** 108 * Get maximum bound. 109 * 110 * @return int 111 */ 112 public function getMax() 113 { 114 return $this->_max; 115 } 116 117 /** 118 * Check whether the maximum repetition is unbounded. 119 * 120 * @return bool 121 */ 122 public function isInfinite() 123 { 124 return -1 === $this->getMax(); 125 } 126} 127