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 
37 namespace Hoa\Compiler\Llk\Rule;
38 
39 use Hoa\Consistency;
40 
41 /**
42  * Class \Hoa\Compiler\Llk\Rule.
43  *
44  * Rule parent.
45  *
46  * @copyright  Copyright © 2007-2017 Hoa community
47  * @license    New BSD License
48  */
49 abstract class Rule
50 {
51     /**
52      * Rule name.
53      *
54      * @var string
55      */
56     protected $_name           = null;
57 
58     /**
59      * Rule's children. Can be an array of names or a single name.
60      *
61      * @var mixed
62      */
63     protected $_children       = null;
64 
65     /**
66      * Node ID.
67      *
68      * @var string
69      */
70     protected $_nodeId         = null;
71 
72     /**
73      * Node options.
74      *
75      * @var array
76      */
77     protected $_nodeOptions    = [];
78 
79     /**
80      * Default ID.
81      *
82      * @var string
83      */
84     protected $_defaultId      = null;
85 
86     /**
87      * Default options.
88      *
89      * @var array
90      */
91     protected $_defaultOptions = [];
92 
93     /**
94      * For non-transitional rule: PP representation.
95      *
96      * @var string
97      */
98     protected $_pp             = null;
99 
100     /**
101      * Whether the rule is transitional or not (i.e. not declared in the grammar
102      * but created by the analyzer).
103      *
104      * @var bool
105      */
106     protected $_transitional   = true;
107 
108 
109 
110     /**
111      * Constructor.
112      *
113      * @param   string  $name        Rule name.
114      * @param   mixed   $children    Children.
115      * @param   string  $nodeId      Node ID.
116      */
117     public function __construct($name, $children, $nodeId = null)
118     {
119         $this->setName($name);
120         $this->setChildren($children);
121         $this->setNodeId($nodeId);
122 
123         return;
124     }
125 
126     /**
127      * Set rule name.
128      *
129      * @param   string  $name    Rule name.
130      * @return  string
131      */
132     public function setName($name)
133     {
134         $old         = $this->_name;
135         $this->_name = $name;
136 
137         return $old;
138     }
139 
140     /**
141      * Get rule name.
142      *
143      * @return  string
144      */
145     public function getName()
146     {
147         return $this->_name;
148     }
149 
150     /**
151      * Set rule's children.
152      *
153      * @param   mixed  $children    Children.
154      * @return  mixed
155      */
156     protected function setChildren($children)
157     {
158         $old             = $this->_children;
159         $this->_children = $children;
160 
161         return $old;
162     }
163 
164     /**
165      * Get rule's children.
166      *
167      * @return  mixed
168      */
169     public function getChildren()
170     {
171         return $this->_children;
172     }
173 
174     /**
175      * Set node ID.
176      *
177      * @param   string  $nodeId    Node ID.
178      * @return  string
179      */
180     public function setNodeId($nodeId)
181     {
182         $old = $this->_nodeId;
183 
184         if (false !== $pos = strpos($nodeId, ':')) {
185             $this->_nodeId      = substr($nodeId, 0, $pos);
186             $this->_nodeOptions = str_split(substr($nodeId, $pos + 1));
187         } else {
188             $this->_nodeId      = $nodeId;
189             $this->_nodeOptions = [];
190         }
191 
192         return $old;
193     }
194 
195     /**
196      * Get node ID.
197      *
198      * @return  string
199      */
200     public function getNodeId()
201     {
202         return $this->_nodeId;
203     }
204 
205     /**
206      * Get node options.
207      *
208      * @retrun  array
209      */
210     public function getNodeOptions()
211     {
212         return $this->_nodeOptions;
213     }
214 
215     /**
216      * Set default ID.
217      *
218      * @param   string  $defaultId    Default ID.
219      * @return  string
220      */
221     public function setDefaultId($defaultId)
222     {
223         $old = $this->_defaultId;
224 
225         if (false !== $pos = strpos($defaultId, ':')) {
226             $this->_defaultId      = substr($defaultId, 0, $pos);
227             $this->_defaultOptions = str_split(substr($defaultId, $pos + 1));
228         } else {
229             $this->_defaultId      = $defaultId;
230             $this->_defaultOptions = [];
231         }
232 
233         return $old;
234     }
235 
236     /**
237      * Get default ID.
238      *
239      * @return  string
240      */
241     public function getDefaultId()
242     {
243         return $this->_defaultId;
244     }
245 
246     /**
247      * Get default options.
248      *
249      * @return  array
250      */
251     public function getDefaultOptions()
252     {
253         return $this->_defaultOptions;
254     }
255 
256     /**
257      * Set PP representation of the rule.
258      *
259      * @param   string  $pp    PP representation.
260      * @return  string
261      */
262     public function setPPRepresentation($pp)
263     {
264         $old                 = $this->_pp;
265         $this->_pp           = $pp;
266         $this->_transitional = false;
267 
268         return $old;
269     }
270 
271     /**
272      * Get PP representation of the rule.
273      *
274      * @return  string
275      */
276     public function getPPRepresentation()
277     {
278         return $this->_pp;
279     }
280 
281     /**
282      * Check whether the rule is transitional or not.
283      *
284      * @return  bool
285      */
286     public function isTransitional()
287     {
288         return $this->_transitional;
289     }
290 }
291 
292 /**
293  * Flex entity.
294  */
295 Consistency::flexEntity('Hoa\Compiler\Llk\Rule\Rule');
296