Completed
Push — master ( 37a545...2ac5c4 )
by Edward
04:29
created

TranslationScheme::applyProductionActions()   F

Complexity

Conditions 85
Paths 85

Size

Total Lines 529
Code Lines 359

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 336
CRAP Score 85.2966

Importance

Changes 0
Metric Value
cc 85
eloc 359
nc 85
nop 1
dl 0
loc 529
ccs 336
cts 348
cp 0.9655
crap 85.2966
rs 3.3333
c 0
b 0
f 0

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