TranslationScheme::applyProductionActions()   F
last analyzed

Complexity

Conditions 99
Paths 99

Size

Total Lines 569
Code Lines 374

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 357
CRAP Score 99.3364

Importance

Changes 4
Bugs 0 Features 0
Metric Value
cc 99
eloc 374
c 4
b 0
f 0
nc 99
nop 1
dl 0
loc 569
ccs 357
cts 369
cp 0.9675
crap 99.3364
rs 3.3333

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/** @noinspection PhpDuplicateSwitchCaseBodyInspection */
4
5
declare(strict_types=1);
6
7
namespace Remorhaz\JSON\Path\Parser;
8
9
use Remorhaz\JSON\Path\Query\AstBuilderInterface;
10
use Remorhaz\UniLex\Grammar\SDD\TranslationSchemeInterface;
11
use Remorhaz\UniLex\Lexer\Token;
12
use Remorhaz\UniLex\Parser\Production;
13
use Remorhaz\UniLex\Parser\Symbol;
14
15
use function array_merge;
16
17
class TranslationScheme implements TranslationSchemeInterface
18
{
19
20
    private $queryAstBuilder;
21
22 123
    public function __construct(AstBuilderInterface $queryAstBuilder)
23
    {
24 123
        $this->queryAstBuilder = $queryAstBuilder;
25 123
    }
26
27
    /**
28
     * @param Symbol $symbol
29
     * @param Token $token
30
     */
31 123
    public function applyTokenActions(Symbol $symbol, Token $token): void
32
    {
33 123
        $s = $symbol->getShortcut();
34 123
        $t = $token->getShortcut();
35 123
        switch ($symbol->getSymbolId()) {
36 123
            case SymbolType::T_NAME:
37 123
            case SymbolType::T_UNESCAPED:
38 123
            case SymbolType::T_REGEXP_MOD:
39 75
                $s['s.text'] = $t['text'];
40 75
                break;
41
42 123
            case SymbolType::T_INT:
43 41
                $s['s.text'] = $t['text'];
44 41
                $s['s.int'] = intval($t['text']);
45 41
                break;
46
        }
47 123
    }
48
49
    /**
50
     * @param Production $production
51
     */
52 123
    public function applyProductionActions(Production $production): void
53
    {
54 123
        $header = $production->getHeaderShortcut();
55 123
        $symbols = $production->getSymbolListShortcut();
56 123
        $hash = "{$production->getHeader()->getSymbolId()}.{$production->getIndex()}";
57
        switch ($hash) {
58 123
            case SymbolType::NT_ROOT . '.0':
59
                // [ 0:NT_JSON_PATH, 1:T_EOI ]
60
                $this
61 123
                    ->queryAstBuilder
62 123
                    ->setOutput(
63 123
                        $symbols[0]['s.value_list_id'],
64 123
                        $symbols[0]['s.is_definite'],
65 123
                        $symbols[0]['s.is_addressable']
66
                    );
67 123
                break;
68
69 123
            case SymbolType::NT_JSON_PATH . '.0':
70
                // [ 0:NT_PATH ]
71 123
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
72 123
                $header['s.is_definite'] = $symbols[0]['s.is_definite'];
73 123
                $header['s.is_addressable'] = $symbols[0]['s.is_addressable'];
74 123
                break;
75
76 123
            case SymbolType::NT_PATH . '.0':
77
                // [ 0:T_ROOT_ABSOLUTE, 1:NT_FILTER_LIST ]
78 123
            case SymbolType::NT_PATH . '.1':
79
                // [ 0:T_ROOT_RELATIVE, 1:NT_FILTER_LIST ]
80 123
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
81 123
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
82 123
                $header['s.is_addressable'] = $symbols[1]['s.is_addressable'];
83 123
                break;
84
85 123
            case SymbolType::NT_DOT_FILTER_NEXT . '.0':
86
                // [ 0:T_LEFT_BRACKET, 1:T_RIGHT_BRACKET ]
87 8
                $header['s.value_list_id'] = $this
88 8
                    ->queryAstBuilder
89 8
                    ->aggregate(
90 8
                        $header['i.filter_name'],
91 8
                        $header['i.value_list_id']
92
                    );
93 8
                $header['s.is_definite'] = $header['i.is_definite'];
94 8
                $header['s.is_addressable'] = false;
95 8
                break;
96
97 123
            case SymbolType::NT_DOT_FILTER_NEXT . '.1':
98
                // [ 0:NT_FILTER_LIST ]
99 58
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
100 58
                $header['s.is_definite'] = $symbols[0]['s.is_definite'];
101 58
                $header['s.is_addressable'] = $symbols[0]['s.is_addressable'];
102 58
                break;
103
104 123
            case SymbolType::NT_DOT_FILTER . '.0':
105
                // [ 0:T_NAME, 1:NT_DOT_FILTER_NEXT ]
106 123
            case SymbolType::NT_DOT_FILTER . '.1':
107
                // [ 0:T_STAR, 1:NT_FILTER_LIST ]
108 123
            case SymbolType::NT_DOT_FILTER . '.2':
109
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
110 123
            case SymbolType::NT_DOT_FILTER . '.3':
111
                // [ 0:NT_STRING, 1:NT_FILTER_LIST ]
112 72
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
113 72
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
114 72
                $header['s.is_addressable'] = $symbols[1]['s.is_addressable'];
115 72
                break;
116
117 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.0':
118
                // [ 0:T_NAME, 1:NT_FILTER_LIST ]
119 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.1':
120
                // [ 0:T_STAR, 1:NT_FILTER_LIST ]
121 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.2':
122
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
123 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.3':
124
                // [ 0:NT_STRING, 1:NT_FILTER_LIST ]
125 19
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
126 19
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
127 19
                $header['s.is_addressable'] = $symbols[1]['s.is_addressable'];
128 19
                break;
129
130 123
            case SymbolType::NT_FILTER_LIST . '.0':
131
                // [ 0:T_DOT, 1:NT_DOT_FILTER ]
132 72
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
133 72
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
134 72
                $header['s.is_addressable'] = $symbols[1]['s.is_addressable'];
135 72
                break;
136
137 123
            case SymbolType::NT_FILTER_LIST . '.1':
138
                // [ 0:T_DOUBLE_DOT, 1:NT_DOUBLE_DOT_FILTER ]
139 19
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
140 19
                $header['s.is_definite'] = false;
141 19
                $header['s.is_addressable'] = $symbols[1]['s.is_addressable'];
142 19
                break;
143
144 123
            case SymbolType::NT_FILTER_LIST . '.2':
145
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
146 89
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
147 89
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
148 89
                $header['s.is_addressable'] = $symbols[1]['s.is_addressable'];
149 89
                break;
150
151 123
            case SymbolType::NT_FILTER_LIST . '.3':
152
                // [ ]
153 116
                $header['s.value_list_id'] = $header['i.value_list_id'];
154 116
                $header['s.is_definite'] = $header['i.is_definite'];
155 116
                $header['s.is_addressable'] = $header['i.is_addressable'];
156 116
                break;
157
158 118
            case SymbolType::NT_PREDICATE . '.0':
159
                // [
160
                //   0:T_LEFT_SQUARE_BRACKET,
161
                //   1:NT_WS_OPT,
162
                //   2:NT_BRACKET_FILTER,
163
                //   3:T_RIGHT_SQUARE_BRACKET,
164
                // ]
165 93
                $header['s.value_list_id'] = $symbols[2]['s.value_list_id'];
166 93
                $header['s.is_definite'] = $symbols[2]['s.is_definite'];
167 93
                $header['s.is_addressable'] = $header['i.is_addressable'];
168 93
                break;
169
170 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.0':
171
                // [ 0:NT_EXPR_GROUP, 1:NT_WS_OPT ]
172 4
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
173 4
                break;
174
175 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.1':
176
                // [ 0:NT_PATH, 1:NT_WS_OPT ]
177 47
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
178 47
                break;
179
180 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.2':
181
                // [ 0:NT_INT, 1:NT_WS_OPT ]
182 18
                $header['s.value_list_id'] = $this
183 18
                    ->queryAstBuilder
184 18
                    ->createScalar($header['i.value_list_id'], $symbols[0]['s.int']);
185 18
                break;
186
187 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.3':
188
                // [ 0:NT_ARRAY, 1:NT_WS_OPT ]
189 2
                $header['s.value_list_id'] = $this
190 2
                    ->queryAstBuilder
191 2
                    ->createLiteralArray($header['i.value_list_id'], $symbols[0]['s.array_id']);
192 2
                break;
193
194 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.4':
195
                // [ 0:T_NULL, 1:NT_WS_OPT ]
196 1
                $header['s.value_list_id'] = $this
197 1
                    ->queryAstBuilder
198 1
                    ->createScalar($header['i.value_list_id'], null);
199 1
                break;
200
201 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.5':
202
                // [ 0:T_TRUE, 1:NT_WS_OPT ]
203 6
                $header['s.value_list_id'] = $this
204 6
                    ->queryAstBuilder
205 6
                    ->createScalar($header['i.value_list_id'], true);
206 6
                break;
207
208 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.6':
209
                // [ 0:T_FALSE, 1:NT_WS_OPT ]
210 5
                $header['s.value_list_id'] = $this
211 5
                    ->queryAstBuilder
212 5
                    ->createScalar($header['i.value_list_id'], false);
213 5
                break;
214
215 118
            case SymbolType::NT_EXPR_ARG_SCALAR . '.7':
216
                // [ 0:NT_STRING, 1:NT_WS_OPT ]
217 7
                $header['s.value_list_id'] = $this
218 7
                    ->queryAstBuilder
219 7
                    ->createScalar($header['i.value_list_id'], $symbols[0]['s.text']);
220 7
                break;
221
222 118
            case SymbolType::NT_INT . '.0':
223
                // [ 0:T_HYPHEN, 1:T_INT ]
224 4
                $header['s.int'] = -$symbols[1]['s.int'];
225 4
                break;
226
227 118
            case SymbolType::NT_INT . '.1':
228
                // [ 0:T_INT ]
229 30
                $header['s.int'] = $symbols[0]['s.int'];
230 30
                break;
231
232 118
            case SymbolType::NT_INT_NEXT . '.0':
233
                // [ 0:NT_WS_OPT, 1:NT_INT_NEXT_LIST ]
234 10
                $header['s.matcher_id'] = $this
235 10
                    ->queryAstBuilder
236 10
                    ->matchElementStrictly(...$symbols[1]['s.int_list']);
237 10
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
238 10
                break;
239
240 118
            case SymbolType::NT_INT_NEXT . '.1':
241
                // [ 0:NT_INT_SLICE ]
242 6
                $header['s.matcher_id'] = $symbols[0]['s.matcher_id'];
243 6
                $header['s.is_definite'] = false;
244 6
                break;
245
246 118
            case SymbolType::NT_INT_SLICE_OPT . '.0':
247
                // [ 0:NT_INT_SLICE ]
248 1
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
249 1
                $header['s.matcher_id'] = $symbols[0]['s.matcher_id'];
250 1
                break;
251
252 118
            case SymbolType::NT_INT_SLICE_OPT . '.1':
253
                // [ ]
254 1
                $header['s.value_list_id'] = $header['i.value_list_id'];
255 1
                $header['s.matcher_id'] = $this
256 1
                    ->queryAstBuilder
257 1
                    ->matchElementSlice(
258 1
                        $header['i.int_start'],
259 1
                        null,
260 1
                        null,
261
                    );
262 1
                break;
263
264 118
            case SymbolType::NT_INT_SLICE . '.0':
265
                // [ 0:T_COLON, 1:NT_INT_OPT, 2:NT_INT_SLICE_STEP, 3:NT_WS_OPT ]
266 12
                $header['s.value_list_id'] = $header['i.value_list_id'];
267 12
                $header['s.matcher_id'] = $this
268 12
                    ->queryAstBuilder
269 12
                    ->matchElementSlice(
270 12
                        $header['i.int_start'],
271 12
                        $symbols[1]['s.int'],
272 12
                        $symbols[2]['s.int'],
273
                    );
274 12
                break;
275
276 118
            case SymbolType::NT_INT_OPT . '.0':
277
                // [ 0:NT_INT ]
278 9
                $header['s.int'] = $symbols[0]['s.int'];
279 9
                break;
280
281 118
            case SymbolType::NT_INT_OPT . '.1':
282 7
                $header['s.int'] = null;
283 7
                break;
284
285 118
            case SymbolType::NT_INT_SLICE_STEP . '.0':
286
                // [ 0:T_COLON, 1:NT_INT_OPT ]
287 8
                $header['s.int'] = $symbols[1]['s.int'];
288 8
                break;
289
290 118
            case SymbolType::NT_INT_SLICE_STEP . '.1':
291
                // [ ]
292 4
                $header['s.int'] = null;
293 4
                break;
294
295 118
            case SymbolType::NT_INT_NEXT_LIST . '.0':
296
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_INT, 3:NT_WS_OPT, 4:NT_INT_NEXT_LIST ]
297 7
                $header['s.int_list'] = $symbols[4]['s.int_list'];
298 7
                $header['s.is_definite'] = false;
299 7
                break;
300
301 118
            case SymbolType::NT_INT_NEXT_LIST . '.1':
302
                // [ ]
303 10
                $header['s.int_list'] = $header['i.int_list'];
304 10
                $header['s.is_definite'] = $header['i.is_definite'];
305 10
                break;
306
307 118
            case SymbolType::NT_STRING_NEXT . '.0':
308
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_PROPERTY, 3:NT_WS_OPT, 4:NT_STRING_NEXT ]
309 4
                $header['s.text_list'] = $symbols[4]['s.text_list'];
310 4
                $header['s.is_definite'] = false;
311 4
                break;
312
313 118
            case SymbolType::NT_STRING_NEXT . '.1':
314
                // [ ]
315 8
                $header['s.text_list'] = $header['i.text_list'];
316 8
                $header['s.is_definite'] = $header['i.is_definite'];
317 8
                break;
318
319 118
            case SymbolType::NT_STRING_LIST . '.0':
320
                // [ 0:NT_PROPERTY, 1:NT_WS_OPT, 2:NT_STRING_NEXT ]
321 8
                $header['s.text_list'] = $symbols[2]['s.text_list'];
322 8
                $header['s.is_definite'] = $symbols[2]['s.is_definite'];
323 8
                break;
324
325 118
            case SymbolType::NT_PROPERTY . '.0':
326
                // [ 0:NT_STRING ]
327 118
            case SymbolType::NT_PROPERTY . '.1':
328
                // [ 0:NT_NAME ]
329 8
                $header['s.text'] = $symbols[0]['s.text'];
330 8
                break;
331
332 118
            case SymbolType::NT_STRING . '.0':
333
                // [ 0:T_SINGLE_QUOTE, 1:NT_STRING_CONTENT, 2:T_SINGLE_QUOTE ]
334 118
            case SymbolType::NT_STRING . '.1':
335
                // [ 0:T_DOUBLE_QUOTE, 1:NT_STRING_CONTENT, 2:T_DOUBLE_QUOTE ]
336 17
                $header['s.text'] = $symbols[1]['s.text'];
337 17
                break;
338
339 118
            case SymbolType::NT_STRING_CONTENT . '.0':
340
                // [ 0:T_UNESCAPED, 1:NT_STRING_CONTENT ]
341 17
                $header['s.text'] = $symbols[1]['s.text'];
342 17
                break;
343
344 118
            case SymbolType::NT_STRING_CONTENT . '.1':
345
                // [ 0:T_BACKSLASH, 1:NT_ESCAPED, 2:NT_STRING_CONTENT ]
346
                $header['s.text'] = $symbols[2]['s.text'];
347
                break;
348
349 118
            case SymbolType::NT_STRING_CONTENT . '.2':
350
                // [ ]
351 17
                $header['s.text'] = $header['i.text'];
352 17
                break;
353
354 115
            case SymbolType::NT_ESCAPED . '.0':
355
                // [ 0:T_BACKSLASH ]
356
                $header['s.text'] = '\\';
357
                break;
358
359 115
            case SymbolType::NT_ESCAPED . '.1':
360
                // [ 0:T_SINGLE_QUOTE ]
361
                $header['s.text'] = '\'';
362
                break;
363
364 115
            case SymbolType::NT_ESCAPED . '.2':
365
                // [ 0:T_DOUBLE_QUOTE ]
366
                $header['s.text'] = '"';
367
                break;
368
369 115
            case SymbolType::NT_ESCAPED . '.3':
370
                // [ 0:T_UNESCAPED ]
371
                $header['s.text'] = $symbols[0]['s.text'];
372
                break;
373
374 115
            case SymbolType::NT_BRACKET_FILTER . '.0':
375
                // [ 0:T_STAR, 1:NT_WS_OPT ]
376 2
                $header['s.value_list_id'] = $this
377 2
                    ->queryAstBuilder
378 2
                    ->fetchChildren(
379 2
                        $header['i.value_list_id'],
380 2
                        $this->queryAstBuilder->matchAnyChild()
381
                    );
382 2
                $header['s.is_definite'] = false;
383 2
                break;
384 115
            case SymbolType::NT_BRACKET_FILTER . '.1':
385
                // [ 0:NT_STRING_LIST ]
386 8
                $header['s.value_list_id'] = $this
387 8
                    ->queryAstBuilder
388 8
                    ->fetchChildren(
389 8
                        $header['i.value_list_id'],
390
                        $this
391 8
                            ->queryAstBuilder
392 8
                            ->matchPropertyStrictly(...$symbols[0]['s.text_list'])
393
                    );
394 8
                $header['s.is_definite'] = $symbols[0]['s.is_definite'];
395 8
                break;
396
397 115
            case SymbolType::NT_BRACKET_FILTER . '.2':
398
                // [ 0:T_INT, 1:NT_INT_NEXT ]
399 16
                $header['s.value_list_id'] = $this
400 16
                    ->queryAstBuilder
401 16
                    ->fetchChildren($header['i.value_list_id'], $symbols[1]['s.matcher_id']);
402 16
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
403 16
                break;
404
405 115
            case SymbolType::NT_BRACKET_FILTER . '.3':
406
                // [ 0:T_HYPHEN, 1:T_INT, 2:NT_INT_SLICE_OPT ]
407 2
                $header['s.value_list_id'] = $this
408 2
                    ->queryAstBuilder
409 2
                    ->fetchChildren($symbols[2]['s.value_list_id'], $symbols[2]['s.matcher_id']);
410 2
                $header['s.is_definite'] = false;
411 2
                break;
412
413 115
            case SymbolType::NT_BRACKET_FILTER . '.4':
414
                // [ 0:NT_INT_SLICE ]
415 5
                $header['s.value_list_id'] = $this
416 5
                    ->queryAstBuilder
417 5
                    ->fetchChildren($symbols[0]['s.value_list_id'], $symbols[0]['s.matcher_id']);
418 5
                $header['s.is_definite'] = false;
419 5
                break;
420
421 115
            case SymbolType::NT_BRACKET_FILTER . '.5':
422
                // [ 0:T_QUESTION, 1:T_LEFT_BRACKET, 2:NT_WS_OPT, 3:NT_EXPR, 4:T_RIGHT_BRACKET ]
423 60
                $header['s.value_list_id'] = $this
424 60
                    ->queryAstBuilder
425 60
                    ->filter(
426 60
                        $symbols[3]['i.context_value_list_id'],
427
                        $this
428 60
                            ->queryAstBuilder
429 60
                            ->joinFilterResults(
430
                                $this
431 60
                                    ->queryAstBuilder
432 60
                                    ->evaluate($symbols[3]['i.value_list_id'], $symbols[3]['s.value_list_id']),
433 60
                                $symbols[3]['i.context_value_list_id'],
434
                            )
435
                    );
436 60
                $header['s.is_definite'] = false;
437 60
                break;
438
439 115
            case SymbolType::NT_EXPR_ARG_COMP . '.0':
440
                // [ 0:T_OP_NOT, 1:NT_EXPR_ARG_SCALAR ]
441 1
                $header['s.value_list_id'] = $this
442 1
                    ->queryAstBuilder
443 1
                    ->evaluateLogicalNot(
444
                        $this
445 1
                            ->queryAstBuilder
446 1
                            ->evaluate($header['i.value_list_id'], $symbols[1]['s.value_list_id'])
447
                    );
448 1
                break;
449
450 115
            case SymbolType::NT_EXPR_ARG_COMP . '.1':
451
                // [ 0:NT_EXPR_ARG_SCALAR ]
452 59
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
453 59
                break;
454
455 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.0':
456
                // [ 0:T_OP_EQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
457 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.1':
458
                // [ 0:T_OP_NEQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
459 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.2':
460
                // [ 0:T_OP_L, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
461 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.3':
462
                // [ 0:T_OP_LE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
463 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.4':
464
                // [ 0:T_OP_G, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
465 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.5':
466
                // [ 0:T_OP_GE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
467 37
                $header['s.value_list_id'] = $symbols[3]['s.value_list_id'];
468 37
                break;
469
470 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.6':
471
                // [ 0:T_OP_REGEX, 1:NT_WS_OPT, 2:NT_REGEXP ],
472 5
                $header['s.value_list_id'] = $this
473 5
                    ->queryAstBuilder
474 5
                    ->calculateIsRegExp($symbols[2]['s.text'], $header['i.left_value_list_id']);
475 5
                break;
476
477 115
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.7':
478
                // [ ]
479 55
                $header['s.value_list_id'] = $header['i.left_value_list_id'];
480 55
                break;
481
482 115
            case SymbolType::NT_EXPR_ARG_AND . '.0':
483
                // [ 0:NT_EXPR_ARG_COMP, 1:NT_EXPR_ARG_COMP_TAIL ]
484 60
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
485 60
                break;
486
487 115
            case SymbolType::NT_EXPR_ARG_AND_TAIL . '.0':
488
                // [ 0:T_OP_AND, 1:NT_WS_OPT, 2:NT_EXPR_ARG_AND, 3:NT_EXPR_ARG_AND_TAIL ]
489 5
                $header['s.value_list_id'] = $symbols[3]['s.value_list_id'];
490 5
                break;
491
492 115
            case SymbolType::NT_EXPR_ARG_AND_TAIL . '.1':
493
                // []
494 60
                $header['s.value_list_id'] = $header['i.left_value_list_id'];
495 60
                break;
496
497 115
            case SymbolType::NT_EXPR_ARG_OR . '.0':
498
                // [ 0:NT_EXPR_ARG_AND, 1:NT_EXPR_ARG_AND_TAIL ]
499 60
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
500 60
                break;
501
502 115
            case SymbolType::NT_EXPR_ARG_OR_TAIL . '.0':
503
                // [ 0:T_OP_OR, 1:NT_WS_OPT, 2:NT_EXPR_ARG_OR, 3:NT_EXPR_ARG_OR_TAIL ]
504 5
                $header['s.value_list_id'] = $symbols[3]['s.value_list_id'];
505 5
                break;
506
507 115
            case SymbolType::NT_EXPR_ARG_OR_TAIL . '.1':
508
                // [ ]
509 60
                $header['s.value_list_id'] = $header['i.left_value_list_id'];
510 60
                break;
511
512 115
            case SymbolType::NT_EXPR . '.0':
513
                // [ 0:NT_EXPR_ARG_OR, 1:NT_EXPR_ARG_OR_TAIL ]
514 60
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
515 60
                break;
516
517 115
            case SymbolType::NT_EXPR_GROUP . '.0':
518
                // [ 0:T_LEFT_BRACKET, 1:NT_WS_OPT, 2:NT_EXPR, 3:T_RIGHT_BRACKET]
519 4
                $header['s.value_list_id'] = $symbols[2]['s.value_list_id'];
520 4
                break;
521
522 115
            case SymbolType::NT_ARRAY . '.0':
523
                // [ 0:T_LEFT_SQUARE_BRACKET, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT, 3:T_RIGHT_SQUARE_BRACKET ]
524 2
                $header['s.array_id'] = $symbols[2]['s.array_id'];
525 2
                break;
526
527 115
            case SymbolType::NT_ARRAY_CONTENT . '.0':
528
                // [ 0:NT_EXPR, 1:NT_ARRAY_CONTENT_TAIL ]
529 2
                $header['s.array_id'] = $symbols[1]['s.array_id'];
530 2
                break;
531
532 115
            case SymbolType::NT_ARRAY_CONTENT . '.1':
533
                // []
534
                $header['s.array_id'] = $header['i.array_id'];
535
                break;
536
537 115
            case SymbolType::NT_ARRAY_CONTENT_TAIL . '.0':
538
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT ]
539 1
                $header['s.array_id'] = $symbols[2]['s.array_id'];
540 1
                break;
541
542 115
            case SymbolType::NT_ARRAY_CONTENT_TAIL . '.1':
543
                // []
544 2
                $header['s.array_id'] = $header['i.array_id'];
545 2
                break;
546
547 115
            case SymbolType::NT_REGEXP . '.0':
548
                // [ 0:T_SLASH, 1:NT_REGEXP_STRING, 2:T_REGEXP_MOD ]
549 5
                $header['s.text'] = $symbols[1]['s.text'] . $symbols[2]['s.text'];
550 5
                break;
551
552 115
            case SymbolType::NT_REGEXP_STRING . '.0':
553
                // [ 0:T_UNESCAPED, 1:NT_REGEXP_STRING ]
554 5
                $header['s.text'] = $symbols[1]['s.text'];
555 5
                break;
556
557 115
            case SymbolType::NT_REGEXP_STRING . '.1':
558
                // [ 0:T_BACKSLASH, 1:NT_REGEXP_ESCAPED, 2:NT_REGEXP_STRING ]
559 3
                $header['s.text'] = $symbols[2]['s.text'];
560 3
                break;
561
562 115
            case SymbolType::NT_REGEXP_STRING . '.2':
563
                // [ ]
564 5
                $header['s.text'] = $header['i.text'];
565 5
                break;
566
567 115
            case SymbolType::NT_REGEXP_ESCAPED . '.0':
568
                // [ 0:T_SLASH ]
569 1
                $header['s.text'] = '\\/';
570 1
                break;
571
572 115
            case SymbolType::NT_REGEXP_ESCAPED . '.1':
573
                // [ 0:T_BACKSLASH ]
574 1
                $header['s.text'] = '\\\\';
575 1
                break;
576
577 115
            case SymbolType::NT_REGEXP_ESCAPED . '.2':
578
                // [ 0:T_UNESCAPED ]
579 1
                $header['s.text'] = $symbols[0]['s.text'];
580 1
                break;
581
582 115
            case SymbolType::NT_NAME . '.0':
583
                // [ 0:T_NAME ]
584 64
                $header['s.text'] = $symbols[0]['s.text'];
585 64
                break;
586
587 115
            case SymbolType::NT_NAME . '.1':
588
                // [ 0:T_NULL ]
589 2
                $header['s.text'] = 'null';
590 2
                break;
591
592 115
            case SymbolType::NT_NAME . '.2':
593
                // [ 0:T_TRUE ]
594 2
                $header['s.text'] = 'true';
595 2
                break;
596
597 115
            case SymbolType::NT_NAME . '.3':
598
                // [ 0:T_FALSE ]
599 2
                $header['s.text'] = 'false';
600 2
                break;
601
602 115
            case SymbolType::NT_DOT_NAME_TAIL . '.0':
603
                // [ 0:NT_NAME ]
604 1
                $header['s.text'] = $header['i.text'] . $symbols[0]['s.text'];
605 1
                break;
606
607 115
            case SymbolType::NT_DOT_NAME_TAIL . '.1':
608
                // [ ]
609 1
                $header['s.text'] = $header['i.text'];
610 1
                break;
611
612 115
            case SymbolType::NT_DOT_NAME . '.0':
613
                // [ 0:NT_NAME ]
614 67
                $header['s.text'] = $symbols[0]['s.text'];
615 67
                break;
616
617 95
            case SymbolType::NT_DOT_NAME . '.1':
618
                // [ 0:NT_INT, 1:NT_DOT_NAME_TAIL ]
619 2
                $header['s.text'] = $symbols[1]['s.text'];
620 2
                break;
621
        }
622 123
    }
623
624
    /**
625
     * @param Production $production
626
     * @param int $symbolIndex
627
     */
628 123
    public function applySymbolActions(Production $production, int $symbolIndex): void
629
    {
630 123
        $header = $production->getHeaderShortcut();
631 123
        $symbols = $production->getSymbolListShortcut();
632 123
        $hash = "{$production->getHeader()->getSymbolId()}.{$production->getIndex()}.{$symbolIndex}";
633
        switch ($hash) {
634 123
            case SymbolType::NT_JSON_PATH . '.0.0':
635
                // [ 0:NT_PATH ]
636 123
                $symbols[0]['i.is_definite'] = true;
637 123
                break;
638
639 123
            case SymbolType::NT_PATH . '.0.1':
640
                // [ 0:T_ROOT_ABSOLUTE, 1:NT_FILTER_LIST ]
641 123
                $symbols[1]['i.value_list_id'] = $this
642 123
                    ->queryAstBuilder
643 123
                    ->getInput();
644 123
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
645 123
                $symbols[1]['i.is_addressable'] = true;
646 123
                break;
647
648 123
            case SymbolType::NT_PATH . '.1.1':
649
                // [ 0:T_ROOT_RELATIVE, 1:NT_FILTER_LIST ]
650 46
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
651 46
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
652 46
                $symbols[1]['i.is_addressable'] = true;
653 46
                break;
654
655 123
            case SymbolType::NT_BRACKET_FILTER . '.1.0':
656
                // [ 0:NT_STRING_LIST ]
657 8
                $symbols[0]['i.is_definite'] = $header['i.is_definite'];
658 8
                break;
659
660 123
            case SymbolType::NT_BRACKET_FILTER . '.2.1':
661
                // [ 0:NT_INT, 1:NT_INT_NEXT ]
662 16
                $symbols[1]['i.int'] = $symbols[0]['s.int'];
663 16
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
664 16
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
665 16
                break;
666
667 123
            case SymbolType::NT_BRACKET_FILTER . '.3.2':
668
                // [ 0:T_HYPHEN, 1:T_INT, 2:NT_INT_SLICE_OPT ]
669 2
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
670 2
                $symbols[2]['i.int_start'] = -$symbols[1]['s.int'];
671 2
                break;
672
673 123
            case SymbolType::NT_BRACKET_FILTER . '.4.0':
674
                // [ 0:NT_INT_SLICE ]
675 5
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
676 5
                $symbols[0]['i.int_start'] = null;
677 5
                break;
678
679 123
            case SymbolType::NT_BRACKET_FILTER . '.5.3':
680
                // [ 0:T_QUESTION, 1:T_LEFT_BRACKET, 2:NT_WS_OPT, 3:NT_EXPR, 4:T_RIGHT_BRACKET ]
681 60
                $symbols[3]['i.context_value_list_id'] = $this
682 60
                    ->queryAstBuilder
683 60
                    ->fetchFilterContext($header['i.value_list_id']);
684 60
                $symbols[3]['i.value_list_id'] = $this
685 60
                    ->queryAstBuilder
686 60
                    ->splitFilterContext($symbols[3]['i.context_value_list_id']);
687 60
                break;
688
689 123
            case SymbolType::NT_DOT_NAME . '.1.1':
690
                // [ 0:T_INT, 1:NT_DOT_NAME_TAIL ]
691 2
                $symbols[1]['i.text'] = $symbols[0]['s.text'];
692 2
                break;
693
694 123
            case SymbolType::NT_EXPR . '.0.0':
695
                // [ 0:NT_EXPR_ARG_OR, 1:NT_EXPR_ARG_OR_TAIL ]
696 60
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
697 60
                break;
698
699 123
            case SymbolType::NT_EXPR . '.0.1':
700
                // [ 0:NT_EXPR_ARG_OR, 1:NT_EXPR_ARG_OR_TAIL ]
701 60
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
702 60
                $symbols[1]['i.left_value_list_id'] = $symbols[0]['s.value_list_id'];
703 60
                break;
704
705 123
            case SymbolType::NT_EXPR_ARG_OR . '.0.0':
706
                // [ 0:NT_EXPR_ARG_AND, 1:NT_EXPR_ARG_AND_TAIL ]
707 60
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
708 60
                break;
709
710 123
            case SymbolType::NT_EXPR_ARG_OR . '.0.1':
711
                // [ 0:NT_EXPR_ARG_AND, 1:NT_EXPR_ARG_AND_TAIL ]
712 60
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
713 60
                $symbols[1]['i.left_value_list_id'] = $symbols[0]['s.value_list_id'];
714 60
                break;
715
716 123
            case SymbolType::NT_EXPR_ARG_OR_TAIL . '.0.2':
717
                // [ 0:T_OP_OR, 1:NT_WS_OPT, 2:NT_EXPR_ARG_OR, 3:NT_EXPR_ARG_OR_TAIL ]
718 5
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
719 5
                break;
720
721 123
            case SymbolType::NT_EXPR_ARG_OR_TAIL . '.0.3':
722
                // [ 0:T_OP_OR, 1:NT_WS_OPT, 2:NT_EXPR_ARG_OR, 3:NT_EXPR_ARG_OR_TAIL ]
723 5
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
724 5
                $symbols[3]['i.left_value_list_id'] = $this
725 5
                    ->queryAstBuilder
726 5
                    ->evaluateLogicalOr(
727
                        $this
728 5
                            ->queryAstBuilder
729 5
                            ->evaluate(
730 5
                                $header['i.value_list_id'],
731 5
                                $header['i.left_value_list_id']
732
                            ),
733
                        $this
734 5
                            ->queryAstBuilder
735 5
                            ->evaluate(
736 5
                                $header['i.value_list_id'],
737 5
                                $symbols[2]['s.value_list_id']
738
                            )
739
                    );
740 5
                break;
741
742 123
            case SymbolType::NT_EXPR_ARG_AND . '.0.0':
743
                // [ 0:NT_EXPR_ARG_COMP, 1:NT_EXPR_ARG_COMP_TAIL ]
744 60
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
745 60
                break;
746
747 123
            case SymbolType::NT_EXPR_ARG_AND . '.0.1':
748
                // [ 0:NT_EXPR_ARG_COMP, 1:NT_EXPR_ARG_COMP_TAIL ]
749 60
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
750 60
                $symbols[1]['i.left_value_list_id'] = $symbols[0]['s.value_list_id'];
751 60
                break;
752
753 123
            case SymbolType::NT_EXPR_ARG_AND_TAIL . '.0.2':
754
                // [ 0:T_OP_AND, 1:NT_WS_OPT, 2:NT_EXPR_ARG_AND, 3:NT_EXPR_ARG_AND_TAIL ]
755 5
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
756 5
                break;
757
758 123
            case SymbolType::NT_EXPR_ARG_AND_TAIL . '.0.3':
759
                // [ 0:T_OP_AND, 1:NT_WS_OPT, 2:NT_EXPR_ARG_AND, 3:NT_EXPR_ARG_AND_TAIL ]
760 5
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
761 5
                $symbols[3]['i.left_value_list_id'] = $this
762 5
                    ->queryAstBuilder
763 5
                    ->evaluateLogicalAnd(
764
                        $this
765 5
                            ->queryAstBuilder
766 5
                            ->evaluate(
767 5
                                $header['i.value_list_id'],
768 5
                                $header['i.left_value_list_id']
769
                            ),
770
                        $this
771 5
                            ->queryAstBuilder
772 5
                            ->evaluate(
773 5
                                $header['i.value_list_id'],
774 5
                                $symbols[2]['s.value_list_id']
775
                            )
776
                    );
777 5
                break;
778
779 123
            case SymbolType::NT_EXPR_ARG_COMP . '.0.1':
780
                // [ 0:T_OP_NOT, 1:NT_EXPR_ARG_SCALAR ]
781 1
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
782 1
                break;
783
784 123
            case SymbolType::NT_EXPR_ARG_COMP . '.1.0':
785
                // [ 0:NT_EXPR_ARG_SCALAR ]
786 59
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
787 59
                break;
788
789 123
            case SymbolType::NT_EXPR_ARG_SCALAR . '.0.0':
790
                // [ 0:NT_EXPR_GROUP, 1:NT_WS_OPT ]
791 4
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
792 4
                break;
793
794 123
            case SymbolType::NT_EXPR_ARG_SCALAR . '.1.0':
795
                // [ 0:NT_PATH, 1:NT_WS_OPT ]
796 47
                $symbols[0]['i.is_definite'] = false;
797 47
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
798 47
                break;
799
800 123
            case SymbolType::NT_EXPR_ARG_SCALAR . '.2.0':
801
                // [ 0:NT_INT, 1:NT_WS_OPT ]
802 18
                break;
803
804 123
            case SymbolType::NT_EXPR_ARG_SCALAR . '.3.0':
805
                // [ 0:NT_ARRAY, 1:NT_WS_OPT ]
806 2
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
807 2
                break;
808
809 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.0.2':
810
                // [ 0:T_OP_EQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
811 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.1.2':
812
                // [ 0:T_OP_NEQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
813 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.2.2':
814
                // [ 0:T_OP_L, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
815 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.3.2':
816
                // [ 0:T_OP_LE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
817 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.4.2':
818
                // [ 0:T_OP_G, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
819 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.5.2':
820
                // [ 0:T_OP_GE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
821 37
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
822 37
                break;
823
824 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.0.3':
825
                // [ 0:T_OP_EQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
826 28
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
827 28
                $symbols[3]['i.left_value_list_id'] = $this
828 28
                    ->queryAstBuilder
829 28
                    ->calculateIsEqual(
830 28
                        $header['i.left_value_list_id'],
831 28
                        $symbols[2]['s.value_list_id']
832
                    );
833 28
                break;
834
835 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.1.3':
836
                // [ 0:T_OP_NEQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
837 2
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
838 2
                $symbols[3]['i.left_value_list_id'] = $this
839 2
                    ->queryAstBuilder
840 2
                    ->evaluateLogicalNot(
841
                        $this
842 2
                            ->queryAstBuilder
843 2
                            ->calculateIsEqual(
844 2
                                $header['i.left_value_list_id'],
845 2
                                $symbols[2]['s.value_list_id']
846
                            )
847
                    );
848 2
                break;
849
850 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.2.3':
851
                // [ 0:T_OP_L, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
852 2
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
853 2
                $symbols[3]['i.left_value_list_id'] = $this
854 2
                    ->queryAstBuilder
855 2
                    ->calculateIsGreater(
856 2
                        $symbols[2]['s.value_list_id'],
857 2
                        $header['i.left_value_list_id']
858
                    );
859 2
                break;
860
861 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.3.3':
862
                // [ 0:T_OP_LE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
863 1
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
864 1
                $symbols[3]['i.left_value_list_id'] = $this
865 1
                    ->queryAstBuilder
866 1
                    ->evaluateLogicalNot(
867
                        $this
868 1
                            ->queryAstBuilder
869 1
                            ->calculateIsGreater(
870 1
                                $header['i.left_value_list_id'],
871 1
                                $symbols[2]['s.value_list_id']
872
                            )
873
                    );
874 1
                break;
875
876 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.4.3':
877
                // [ 0:T_OP_G, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
878 3
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
879 3
                $symbols[3]['i.left_value_list_id'] = $this
880 3
                    ->queryAstBuilder
881 3
                    ->calculateIsGreater(
882 3
                        $header['i.left_value_list_id'],
883 3
                        $symbols[2]['s.value_list_id']
884
                    );
885 3
                break;
886
887 123
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . '.5.3':
888
                // [ 0:T_OP_GE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
889 1
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
890 1
                $symbols[3]['i.left_value_list_id'] = $this
891 1
                    ->queryAstBuilder
892 1
                    ->evaluateLogicalNot(
893
                        $this
894 1
                            ->queryAstBuilder
895 1
                            ->calculateIsGreater(
896 1
                                $symbols[2]['s.value_list_id'],
897 1
                                $header['i.left_value_list_id']
898
                            )
899
                    );
900 1
                break;
901
902 123
            case SymbolType::NT_EXPR_GROUP . '.0.2':
903
                // [ 0:T_LEFT_BRACKET, 1:NT_WS_OPT, 2:NT_EXPR, 3:T_RIGHT_BRACKET ]
904 4
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
905 4
                break;
906
907 123
            case SymbolType::NT_STRING_LIST . '.0.2':
908
                // [ 0:NT_PROPERTY, 1:NT_WS_OPT, 2:NT_STRING_NEXT ]
909 8
                $symbols[2]['i.text_list'] = [$symbols[0]['s.text']];
910 8
                $symbols[2]['i.is_definite'] = $header['i.is_definite'];
911 8
                break;
912
913 123
            case SymbolType::NT_STRING_NEXT . '.0.4':
914
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_PROPERTY, 3:NT_WS_OPT, 4:NT_STRING_NEXT ]
915 4
                $symbols[4]['i.text_list'] = array_merge($header['i.text_list'], [$symbols[2]['s.text']]);
916 4
                $symbols[4]['i.is_definite'] = false;
917 4
                break;
918
919 123
            case SymbolType::NT_INT_NEXT . '.0.1':
920
                // [ 0:NT_WS_OPT, 1:NT_INT_NEXT_LIST ]
921 10
                $symbols[1]['i.int_list'] = [$header['i.int']];
922 10
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
923 10
                break;
924
925 123
            case SymbolType::NT_INT_NEXT_LIST . '.0.4':
926
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_INT, 3:NT_WS_OPT, 4:NT_INT_NEXT_LIST ]
927 7
                $symbols[4]['i.int_list'] = array_merge($header['i.int_list'], [$symbols[2]['s.int']]);
928 7
                $symbols[4]['i.is_definite'] = false;
929 7
                break;
930
931 123
            case SymbolType::NT_INT_NEXT . '.1.0':
932
                // [ 0:NT_INT_SLICE ]
933 6
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id']; // TODO: probably useless
934 6
                $symbols[0]['i.int_start'] = $header['i.int'];
935 6
                break;
936
937 123
            case SymbolType::NT_INT_SLICE_OPT . '.0.0':
938
                // [ 0:NT_INT_SLICE ]
939 1
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
940 1
                $symbols[0]['i.int_start'] = $header['i.int_start'];
941 1
                break;
942
943 123
            case SymbolType::NT_FILTER_LIST . '.0.1':
944
                // [ 0:T_DOT, 1:NT_DOT_FILTER ]
945 72
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
946 72
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
947 72
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
948 72
                break;
949
950 123
            case SymbolType::NT_FILTER_LIST . '.1.1':
951
                // [ 0:T_DOUBLE_DOT, 1:NT_DOUBLE_DOT_FILTER ]
952 19
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
953 19
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
954 19
                break;
955
956 123
            case SymbolType::NT_FILTER_LIST . '.2.0':
957
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
958 89
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
959 89
                $symbols[0]['i.is_definite'] = $header['i.is_definite'];
960 89
                $symbols[0]['i.is_addressable'] = $header['i.is_addressable'];
961 89
                break;
962
963 123
            case SymbolType::NT_FILTER_LIST . '.2.1':
964
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
965 89
                $symbols[1]['i.value_list_id'] = $symbols[0]['s.value_list_id'];
966 89
                $symbols[1]['i.is_definite'] = $symbols[0]['s.is_definite'];
967 89
                $symbols[1]['i.is_addressable'] = $symbols[0]['s.is_addressable'];
968 89
                break;
969
970 123
            case SymbolType::NT_PREDICATE . '.0.2':
971
                // [
972
                //   0:T_LEFT_SQUARE_BRACKET,
973
                //   1:NT_WS_OPT,
974
                //   2:NT_BRACKET_FILTER,
975
                //   3:T_RIGHT_SQUARE_BRACKET,
976
                // ]
977 93
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
978 93
                $symbols[2]['i.is_definite'] = $header['i.is_definite'];
979 93
                break;
980
981 123
            case SymbolType::NT_DOT_FILTER . '.0.1':
982
                // [ 0:T_NAME, 1:NT_DOT_FILTER_NEXT ]
983 64
                $symbols[1]['i.filter_name'] = $symbols[0]['s.text'];
984 64
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
985 64
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
986 64
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
987 64
                break;
988
989 123
            case SymbolType::NT_DOT_FILTER . '.3.1':
990
                // [ 0:NT_STRING, 1:NT_FILTER_LIST ]
991 2
                $symbols[1]['i.value_list_id'] = $this
992 2
                    ->queryAstBuilder
993 2
                    ->fetchChildren(
994 2
                        $header['i.value_list_id'],
995
                        $this
996 2
                            ->queryAstBuilder
997 2
                            ->matchPropertyStrictly($symbols[0]['s.text'])
998
                    );
999 2
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
1000 2
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
1001 2
                break;
1002
1003 123
            case SymbolType::NT_DOT_FILTER . '.1.1':
1004
                // [ 0:T_STAR, 1:NT_FILTER_LIST ]
1005 5
                $symbols[1]['i.value_list_id'] = $this
1006 5
                    ->queryAstBuilder
1007 5
                    ->fetchChildren(
1008 5
                        $header['i.value_list_id'],
1009 5
                        $this->queryAstBuilder->matchAnyChild()
1010
                    );
1011 5
                $symbols[1]['i.is_definite'] = false;
1012 5
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
1013 5
                break;
1014
1015 123
            case SymbolType::NT_DOT_FILTER . '.2.0':
1016
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
1017 1
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
1018 1
                $symbols[0]['i.is_definite'] = $header['i.is_definite'];
1019 1
                $symbols[0]['i.is_addressable'] = $header['i.is_addressable'];
1020 1
                break;
1021
1022 123
            case SymbolType::NT_DOT_FILTER . '.2.1':
1023
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
1024 1
                $symbols[1]['i.value_list_id'] = $symbols[0]['s.value_list_id'];
1025 1
                $symbols[1]['i.is_definite'] = $symbols[0]['s.is_definite'];
1026 1
                $symbols[1]['i.is_addressable'] = $symbols[0]['s.is_addressable'];
1027 1
                break;
1028
1029 123
            case SymbolType::NT_DOT_FILTER_NEXT . '.1.0':
1030
                // [ 0:NT_FILTER_LIST ]
1031 58
                $symbols[0]['i.value_list_id'] = $this
1032 58
                    ->queryAstBuilder
1033 58
                    ->fetchChildren(
1034 58
                        $header['i.value_list_id'],
1035
                        $this
1036 58
                            ->queryAstBuilder
1037 58
                            ->matchPropertyStrictly($header['i.filter_name'])
1038
                    );
1039 58
                $symbols[0]['i.is_definite'] = $header['i.is_definite'];
1040 58
                $symbols[0]['i.is_addressable'] = $header['i.is_addressable'];
1041 58
                break;
1042
1043 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.0.1':
1044
                // [ 0:T_NAME, 1:NT_FILTER_LIST ]
1045 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.3.1':
1046
                // [ 0:NT_STRING, 1:NT_FILTER_LIST ]
1047 11
                $symbols[1]['i.value_list_id'] = $this
1048 11
                    ->queryAstBuilder
1049 11
                    ->fetchChildrenDeep(
1050 11
                        $header['i.value_list_id'],
1051
                        $this
1052 11
                            ->queryAstBuilder
1053 11
                            ->matchPropertyStrictly($symbols[0]['s.text'])
1054
                    );
1055 11
                $symbols[1]['i.is_definite'] = false;
1056 11
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
1057 11
                break;
1058
1059 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.1.1':
1060
                // [ 0:T_STAR, 1:NT_FILTER_LIST ]
1061 5
                $symbols[1]['i.value_list_id'] = $this
1062 5
                    ->queryAstBuilder
1063 5
                    ->fetchChildrenDeep(
1064 5
                        $header['i.value_list_id'],
1065 5
                        $this->queryAstBuilder->matchAnyChild()
1066
                    );
1067 5
                $symbols[1]['i.is_definite'] = false;
1068 5
                $symbols[1]['i.is_addressable'] = $header['i.is_addressable'];
1069 5
                break;
1070
1071 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.2.0':
1072
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
1073 3
                $symbols[0]['i.value_list_id'] = $this
1074 3
                    ->queryAstBuilder
1075 3
                    ->merge(
1076 3
                        $header['i.value_list_id'],
1077
                        $this
1078 3
                            ->queryAstBuilder
1079 3
                            ->fetchChildrenDeep(
1080 3
                                $header['i.value_list_id'],
1081 3
                                $this->queryAstBuilder->matchAnyChild()
1082
                            ),
1083
                    );
1084 3
                $symbols[0]['i.is_definite'] = false;
1085 3
                $symbols[0]['i.is_addressable'] = $header['i.is_addressable'];
1086 3
                break;
1087
1088 123
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.2.1':
1089
                // [ 0:NT_PREDICATE, 1:NT_FILTER_LIST ]
1090 3
                $symbols[1]['i.value_list_id'] = $symbols[0]['s.value_list_id'];
1091 3
                $symbols[1]['i.is_definite'] = $symbols[0]['s.is_definite'];
1092 3
                $symbols[1]['i.is_addressable'] = $symbols[0]['s.is_addressable'];
1093 3
                break;
1094
1095 123
            case SymbolType::NT_STRING . '.0.1':
1096
                // [ 0:T_SINGLE_QUOTE, 1:NT_STRING_CONTENT, 2:T_SINGLE_QUOTE ]
1097 123
            case SymbolType::NT_STRING . '.1.1':
1098
                // [ 0:T_DOUBLE_QUOTE, 1:NT_STRING_CONTENT, 2:T_DOUBLE_QUOTE ]
1099 17
                $symbols[1]['i.text'] = '';
1100 17
                break;
1101
1102 123
            case SymbolType::NT_STRING_CONTENT . '.0.1':
1103
                // [ 0:T_UNESCAPED, 1:NT_STRING_CONTENT ]
1104 17
                $symbols[1]['i.text'] = $header['i.text'] . $symbols[0]['s.text'];
1105 17
                break;
1106
1107 123
            case SymbolType::NT_STRING_CONTENT . '.1.2':
1108
                // [ 0:T_BACKSLASH, 1:NT_ESCAPED, 2:NT_STRING_CONTENT ]
1109
                $symbols[2]['i.text'] = $header['i.text'] . $symbols[1]['s.text'];
1110
                break;
1111
1112 123
            case SymbolType::NT_ARRAY . '.0.2':
1113
                // [ 0:T_LEFT_SQUARE_BRACKET, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT, 3:T_RIGHT_SQUARE_BRACKET ]
1114 2
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
1115 2
                $symbols[2]['i.array_id'] = $this
1116 2
                    ->queryAstBuilder
1117 2
                    ->createArray();
1118 2
                break;
1119
1120 123
            case SymbolType::NT_ARRAY_CONTENT . '.0.0':
1121
                // [ 0:NT_EXPR, 1:NT_ARRAY_CONTENT_TAIL ]
1122 2
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
1123 2
                break;
1124
1125 123
            case SymbolType::NT_ARRAY_CONTENT . '.0.1':
1126
                // [ 0:NT_EXPR, 1:NT_ARRAY_CONTENT_TAIL ]
1127 2
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
1128 2
                $symbols[1]['i.array_id'] = $this
1129 2
                    ->queryAstBuilder
1130 2
                    ->appendToArray($header['i.array_id'], $symbols[0]['s.value_list_id']);
1131
1132 2
                break;
1133
1134 123
            case SymbolType::NT_ARRAY_CONTENT_TAIL . '.0.2':
1135
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT ]
1136 1
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
1137 1
                $symbols[2]['i.array_id'] = $header['i.array_id'];
1138 1
                break;
1139
1140 123
            case SymbolType::NT_REGEXP . '.0.1':
1141
                // [ 0:T_SLASH, 1:NT_REGEXP_STRING, 2:T_REGEXP_MOD ]
1142 5
                $symbols[1]['i.text'] = '/';
1143 5
                break;
1144
1145 123
            case SymbolType::NT_REGEXP_STRING . '.0.1':
1146
                // [ 0:T_UNESCAPED, 1:NT_REGEXP_STRING ]
1147 5
                $symbols[1]['i.text'] = $header['i.text'] . $symbols[0]['s.text'];
1148 5
                break;
1149
1150 123
            case SymbolType::NT_REGEXP_STRING . '.1.2':
1151
                // [ 0:T_BACKSLASH, 1:NT_REGEXP_ESCAPED, 2:NT_REGEXP_STRING ]
1152 3
                $symbols[2]['i.text'] = $header['i.text'] . $symbols[1]['s.text'];
1153 3
                break;
1154
        }
1155 123
    }
1156
}
1157