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

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 62
Paths 62

Size

Total Lines 461
Code Lines 312

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 241
CRAP Score 62.0021

Importance

Changes 0
Metric Value
cc 62
eloc 312
c 0
b 0
f 0
nc 62
nop 2
dl 0
loc 461
ccs 241
cts 243
cp 0.9918
crap 62.0021
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
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