Completed
Push — master ( 113bfa...89e2e4 )
by Edward
07:06
created

TranslationScheme::applyProductionActions()   F

Complexity

Conditions 85
Paths 85

Size

Total Lines 545
Code Lines 370

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 347
CRAP Score 85.2692

Importance

Changes 0
Metric Value
cc 85
eloc 370
nc 85
nop 1
dl 0
loc 545
ccs 347
cts 359
cp 0.9666
crap 85.2692
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.int_lists_id'] = $this
246 2
                    ->queryAstBuilder
247 2
                    ->populateIndexList(
248 2
                        $header['i.value_list_id'],
249 2
                        ...$symbols[1]['s.int_list']
250
                    );
251 2
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
252 2
                break;
253
254 88
            case SymbolType::NT_INT_NEXT . '.1':
255
                // [ 0:NT_INT_SLICE ]
256 7
                $header['s.int_lists_id'] = $symbols[0]['s.int_lists_id'];
257 7
                $header['s.is_definite'] = false;
258 7
                break;
259
260 88
            case SymbolType::NT_INT_SLICE . '.0':
261
                // [ 0:T_COLON, 1:NT_INT_OPT, 2:NT_INT_SLICE_STEP, 3:NT_WS_OPT ]
262 12
                $header['s.value_list_id'] = $header['i.value_list_id'];
263 12
                $header['s.int_lists_id'] = $this
264 12
                    ->queryAstBuilder
265 12
                    ->populateIndexSlice(
266 12
                        $header['i.value_list_id'],
267 12
                        $header['i.int_start'],
268 12
                        $symbols[1]['s.int'],
269 12
                        $symbols[2]['s.int']
270
                    );
271 12
                break;
272
273 88
            case SymbolType::NT_INT_OPT . '.0':
274
                // [ 0:NT_INT ]
275 9
                $header['s.int'] = $symbols[0]['s.int'];
276 9
                break;
277
278 88
            case SymbolType::NT_INT_OPT . '.1':
279 7
                $header['s.int'] = null;
280 7
                break;
281
282 88
            case SymbolType::NT_INT_SLICE_STEP . '.0':
283
                // [ 0:T_COLON, 1:NT_INT_OPT ]
284 8
                $header['s.int'] = $symbols[1]['s.int'];
285 8
                break;
286
287 88
            case SymbolType::NT_INT_SLICE_STEP . '.1':
288
                // [ ]
289 4
                $header['s.int'] = null;
290 4
                break;
291
292 88
            case SymbolType::NT_INT_NEXT_LIST . ".0":
293
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_INT, 3:NT_WS_OPT, 4:NT_INT_NEXT_LIST ]
294 1
                $header['s.int_list'] = $symbols[4]['s.int_list'];
295 1
                $header['s.is_definite'] = false;
296 1
                break;
297
298 88
            case SymbolType::NT_INT_NEXT_LIST . ".1":
299
                // [ ]
300 2
                $header['s.int_list'] = $header['i.int_list'];
301 2
                $header['s.is_definite'] = $header['i.is_definite'];
302 2
                break;
303
304 88
            case SymbolType::NT_STRING_NEXT . ".0":
305
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_STRING, 3:NT_WS_OPT, 4:NT_STRING_NEXT ]
306 1
                $header['s.text_list'] = $symbols[4]['s.text_list'];
307 1
                $header['s.is_definite'] = false;
308 1
                break;
309
310 88
            case SymbolType::NT_STRING_NEXT . ".1":
311
                // [ ]
312 2
                $header['s.text_list'] = $header['i.text_list'];
313 2
                $header['s.is_definite'] = $header['i.is_definite'];
314 2
                break;
315
316 88
            case SymbolType::NT_STRING_LIST . ".0":
317
                // [ 0:NT_STRING, 1:NT_WS_OPT, 2:NT_STRING_NEXT ]
318 2
                $header['s.text_list'] = $symbols[2]['s.text_list'];
319 2
                $header['s.is_definite'] = $symbols[2]['s.is_definite'];
320 2
                break;
321
322 88
            case SymbolType::NT_STRING . ".0":
323 88
            case SymbolType::NT_STRING . ".1":
324 9
                $header['s.text'] = $symbols[1]['s.text'];
325 9
                break;
326
327 88
            case SymbolType::NT_STRING_CONTENT . ".0":
328 9
                $header['s.text'] = $symbols[1]['s.text'];
329 9
                break;
330
331 88
            case SymbolType::NT_STRING_CONTENT . ".1":
332
                $header['s.text'] = $symbols[2]['s.text'];
333
                break;
334
335 88
            case SymbolType::NT_STRING_CONTENT . ".2":
336 9
                $header['s.text'] = $header['i.text'];
337 9
                break;
338
339 88
            case SymbolType::NT_ESCAPED . ".0":
340
                $header['s.text'] = '\\';
341
                break;
342
343 88
            case SymbolType::NT_ESCAPED . ".1":
344
                $header['s.text'] = '\'';
345
                break;
346
347 88
            case SymbolType::NT_ESCAPED . ".2":
348
                $header['s.text'] = '"';
349
                break;
350
351 88
            case SymbolType::NT_ESCAPED . ".3":
352
                $header['s.text'] = $symbols[0]['s.text'];
353
                break;
354
355 88
            case SymbolType::NT_BRACKET_FILTER . ".0":
356
                // [ 0:T_STAR, 1:NT_WS_OPT ]
357 3
                $header['s.value_list_id'] = $this
358 3
                    ->queryAstBuilder
359 3
                    ->fetchChildren(
360 3
                        $header['i.value_list_id'],
361 3
                        $this->queryAstBuilder->matchAnyChild($header['i.value_list_id'])
362
                    );
363 3
                $header['s.is_definite'] = false;
364 3
                break;
365 88
            case SymbolType::NT_BRACKET_FILTER . ".1":
366
                // [ 0:NT_STRING_LIST ]
367 2
                $header['s.value_list_id'] = $this
368 2
                    ->queryAstBuilder
369 2
                    ->fetchChildren(
370 2
                        $header['i.value_list_id'],
371
                        $this
372 2
                            ->queryAstBuilder
373 2
                            ->matchPropertyStrictly(
374 2
                                $this->queryAstBuilder->populateNameList(
375 2
                                    $header['i.value_list_id'],
376 2
                                    ...$symbols[0]['s.text_list']
377
                                )
378
                            )
379
                    );
380 2
                $header['s.is_definite'] = $symbols[0]['s.is_definite'];
381 2
                break;
382
383 88
            case SymbolType::NT_BRACKET_FILTER . ".2":
384
                // [ 0:NT_INT, 1:NT_INT_NEXT ]
385 9
                $header['s.value_list_id'] = $this
386 9
                    ->queryAstBuilder
387 9
                    ->fetchChildren(
388 9
                        $header['i.value_list_id'],
389
                        $this
390 9
                            ->queryAstBuilder
391 9
                            ->matchElementStrictly($symbols[1]['s.int_lists_id'])
392
                    );
393 9
                $header['s.is_definite'] = $symbols[1]['s.is_definite'];
394 9
                break;
395
396 88
            case SymbolType::NT_BRACKET_FILTER . '.3':
397
                // [ 0:NT_INT_SLICE ]
398 5
                $header['s.value_list_id'] = $this
399 5
                    ->queryAstBuilder
400 5
                    ->fetchChildren(
401 5
                        $symbols[0]['s.value_list_id'],
402 5
                        $this->queryAstBuilder->matchElementStrictly($symbols[0]['s.int_lists_id'])
403
                    );
404 5
                $header['s.is_definite'] = false;
405 5
                break;
406
407 88
            case SymbolType::NT_BRACKET_FILTER . ".4":
408
                // [ 0:T_QUESTION, 1:T_LEFT_BRACKET, 2:NT_WS_OPT, 3:NT_EXPR, 4:T_RIGHT_BRACKET ]
409 53
                $header['s.value_list_id'] = $this
410 53
                    ->queryAstBuilder
411 53
                    ->filter(
412 53
                        $symbols[3]['i.context_value_list_id'],
413
                        $this
414 53
                            ->queryAstBuilder
415 53
                            ->evaluate(
416 53
                                $symbols[3]['i.value_list_id'],
417 53
                                $symbols[3]['s.value_list_id']
418
                            )
419
                    );
420 53
                $header['s.is_definite'] = false;
421 53
                break;
422
423 88
            case SymbolType::NT_EXPR_ARG_COMP . ".0":
424
                // [ 0:T_OP_NOT, 1:NT_EXPR_ARG_SCALAR ]
425 1
                $header['s.value_list_id'] = $this
426 1
                    ->queryAstBuilder
427 1
                    ->evaluateLogicalNot(
428
                        $this
429 1
                            ->queryAstBuilder
430 1
                            ->evaluate(
431 1
                                $header['i.value_list_id'],
432 1
                                $symbols[1]['s.value_list_id']
433
                            )
434
                    );
435 1
                break;
436
437 88
            case SymbolType::NT_EXPR_ARG_COMP . ".1":
438
                // [ 0:NT_EXPR_ARG_SCALAR ]
439 52
                $header['s.value_list_id'] = $symbols[0]['s.value_list_id'];
440 52
                break;
441
442 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".0":
443
                // [ 0:T_OP_EQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
444 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".1":
445
                // [ 0:T_OP_NEQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
446 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".2":
447
                // [ 0:T_OP_L, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
448 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".3":
449
                // [ 0:T_OP_LE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
450 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".4":
451
                // [ 0:T_OP_G, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
452 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".5":
453
                // [ 0:T_OP_GE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
454 30
                $header['s.value_list_id'] = $symbols[3]['s.value_list_id'];
455 30
                break;
456
457 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".6":
458
                // [ 0:T_OP_REGEX, 1:NT_WS_OPT, 2:NT_REGEXP ],
459 5
                $header['s.value_list_id'] = $this
460 5
                    ->queryAstBuilder
461 5
                    ->calculateIsRegExp(
462 5
                        $symbols[2]['s.text'],
463 5
                        $header['i.left_value_list_id']
464
                    );
465 5
                break;
466
467 88
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".8":
468
                // [ ]
469 48
                $header['s.value_list_id'] = $header['i.left_value_list_id'];
470 48
                break;
471
472 88
            case SymbolType::NT_EXPR_ARG_AND . ".0":
473
                // [ 0:NT_EXPR_ARG_COMP, 1:NT_EXPR_ARG_COMP_TAIL ]
474 53
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
475 53
                break;
476
477 88
            case SymbolType::NT_EXPR_ARG_AND_TAIL . ".0":
478
                // [ 0:T_OP_AND, 1:NT_WS_OPT, 2:NT_EXPR_ARG_AND, 3:NT_EXPR_ARG_AND_TAIL ]
479 5
                $header['s.value_list_id'] = $symbols[3]['s.value_list_id'];
480 5
                break;
481
482 88
            case SymbolType::NT_EXPR_ARG_AND_TAIL . ".1":
483
                // []
484 53
                $header['s.value_list_id'] = $header['i.left_value_list_id'];
485 53
                break;
486
487 88
            case SymbolType::NT_EXPR_ARG_OR . ".0":
488
                // [ 0:NT_EXPR_ARG_AND, 1:NT_EXPR_ARG_AND_TAIL ]
489 53
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
490 53
                break;
491
492 88
            case SymbolType::NT_EXPR_ARG_OR_TAIL . ".0":
493
                // [ 0:T_OP_OR, 1:NT_WS_OPT, 2:NT_EXPR_ARG_OR, 3:NT_EXPR_ARG_OR_TAIL ]
494 5
                $header['s.value_list_id'] = $symbols[3]['s.value_list_id'];
495 5
                break;
496
497 88
            case SymbolType::NT_EXPR_ARG_OR_TAIL . ".1":
498
                // [ ]
499 53
                $header['s.value_list_id'] = $header['i.left_value_list_id'];
500 53
                break;
501
502 88
            case SymbolType::NT_EXPR . ".0":
503
                // [ 0:NT_EXPR_ARG_OR, 1:NT_EXPR_ARG_OR_TAIL ]
504 53
                $header['s.value_list_id'] = $symbols[1]['s.value_list_id'];
505 53
                break;
506
507 88
            case SymbolType::NT_EXPR_GROUP . ".0":
508
                // [ 0:T_LEFT_BRACKET, 1:NT_WS_OPT, 2:NT_EXPR, 3:T_RIGHT_BRACKET]
509 4
                $header['s.value_list_id'] = $symbols[2]['s.value_list_id'];
510 4
                break;
511
512 88
            case SymbolType::NT_ARRAY . '.0':
513
                // [ 0:T_LEFT_SQUARE_BRACKET, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT, 3:T_RIGHT_SQUARE_BRACKET ]
514 2
                $header['s.array_id'] = $symbols[2]['s.array_id'];
515 2
                break;
516
517 88
            case SymbolType::NT_ARRAY_CONTENT . '.0':
518
                // [ 0:NT_EXPR, 1:NT_ARRAY_CONTENT_TAIL ]
519 2
                $header['s.array_id'] = $symbols[1]['s.array_id'];
520 2
                break;
521
522 88
            case SymbolType::NT_ARRAY_CONTENT . '.1':
523
                // []
524
                $header['s.array_id'] = $header['i.array_id'];
525
                break;
526
527 88
            case SymbolType::NT_ARRAY_CONTENT_TAIL . '.0':
528
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT ]
529 1
                $header['s.array_id'] = $symbols[2]['s.array_id'];
530 1
                break;
531
532 88
            case SymbolType::NT_ARRAY_CONTENT_TAIL . '.1':
533
                // []
534 2
                $header['s.array_id'] = $header['i.array_id'];
535 2
                break;
536
537 88
            case SymbolType::NT_REGEXP . '.0':
538
                // [ 0:T_SLASH, 1:NT_REGEXP_STRING, 2:T_REGEXP_MOD ]
539 5
                $header['s.text'] = $symbols[1]['s.text'] . $symbols[2]['s.text'];
540 5
                break;
541
542 88
            case SymbolType::NT_REGEXP_STRING . '.0':
543
                // [ 0:T_UNESCAPED, 1:NT_REGEXP_STRING ]
544 5
                $header['s.text'] = $symbols[1]['s.text'];
545 5
                break;
546
547 88
            case SymbolType::NT_REGEXP_STRING . '.1':
548
                // [ 0:T_BACKSLASH, 1:NT_REGEXP_ESCAPED, 2:NT_REGEXP_STRING ]
549 3
                $header['s.text'] = $symbols[2]['s.text'];
550 3
                break;
551
552 88
            case SymbolType::NT_REGEXP_STRING . '.2':
553
                // [ ]
554 5
                $header['s.text'] = $header['i.text'];
555 5
                break;
556
557 88
            case SymbolType::NT_REGEXP_ESCAPED . '.0':
558
                // [ 0:T_SLASH ]
559 1
                $header['s.text'] = '\\/';
560 1
                break;
561
562 88
            case SymbolType::NT_REGEXP_ESCAPED . '.1':
563
                // [ 0:T_BACKSLASH ]
564 1
                $header['s.text'] = '\\\\';
565 1
                break;
566
567 88
            case SymbolType::NT_REGEXP_ESCAPED . '.2':
568
                // [ 0:T_UNESCAPED ]
569 1
                $header['s.text'] = $symbols[0]['s.text'];
570 1
                break;
571
572 88
            case SymbolType::NT_NAME . '.0':
573
                // [ 0:T_NAME ]
574 50
                $header['s.text'] = $symbols[0]['s.text'];
575 50
                break;
576
577 77
            case SymbolType::NT_NAME . '.1':
578
                // [ 0:T_NULL ]
579 2
                $header['s.text'] = 'null';
580 2
                break;
581
582 75
            case SymbolType::NT_NAME . '.2':
583
                // [ 0:T_TRUE ]
584 2
                $header['s.text'] = 'true';
585 2
                break;
586
587 73
            case SymbolType::NT_NAME . '.3':
588
                // [ 0:T_FALSE ]
589 2
                $header['s.text'] = 'false';
590 2
                break;
591
        }
592 93
    }
593
594
    /**
595
     * @param Production $production
596
     * @param int $symbolIndex
597
     */
598 93
    public function applySymbolActions(Production $production, int $symbolIndex): void
599
    {
600 93
        $header = $production->getHeaderShortcut();
601 93
        $symbols = $production->getSymbolListShortcut();
602 93
        $hash = "{$production->getHeader()->getSymbolId()}.{$production->getIndex()}.{$symbolIndex}";
603 93
        switch ($hash) {
604
            case SymbolType::NT_JSON_PATH . ".0.0":
605
                // [ 0:NT_PATH ]
606 93
                $symbols[0]['i.is_definite'] = true;
607 93
                break;
608
609
            case SymbolType::NT_PATH . ".0.1":
610
                // [ 0:T_ROOT_ABSOLUTE, 1:NT_FILTER_LIST ]
611 93
                $symbols[1]['i.value_list_id'] = $this
612 93
                    ->queryAstBuilder
613 93
                    ->getInput();
614 93
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
615 93
                $symbols[1]['i.is_path'] = true;
616 93
                break;
617
618
            case SymbolType::NT_PATH . ".1.1":
619
                // [ 0:T_ROOT_RELATIVE, 1:NT_FILTER_LIST ]
620 39
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
621 39
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
622 39
                $symbols[1]['i.is_path'] = true;
623 39
                break;
624
625
            case SymbolType::NT_BRACKET_FILTER . ".1.0":
626
                // [ 0:NT_STRING_LIST ]
627 2
                $symbols[0]['i.is_definite'] = $header['i.is_definite'];
628 2
                break;
629
630
            case SymbolType::NT_BRACKET_FILTER . ".2.1":
631
                // 0:NT_INT, 1:NT_INT_NEXT
632 9
                $symbols[1]['i.int'] = $symbols[0]['s.int'];
633 9
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
634 9
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
635 9
                break;
636
637
            case SymbolType::NT_BRACKET_FILTER . '.3.0':
638
                // [ 0:NT_INT_SLICE ]
639 5
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
640 5
                $symbols[0]['i.int_start'] = null;
641 5
                break;
642
643
            case SymbolType::NT_BRACKET_FILTER . ".4.3":
644
                // [ 0:T_QUESTION, 1:T_LEFT_BRACKET, 2:NT_WS_OPT, 3:NT_EXPR, 4:T_RIGHT_BRACKET ]
645 53
                $symbols[3]['i.context_value_list_id'] = $this
646 53
                    ->queryAstBuilder
647 53
                    ->createFilterContext($header['i.value_list_id']);
648 53
                $symbols[3]['i.value_list_id'] = $this
649 53
                    ->queryAstBuilder
650 53
                    ->split($symbols[3]['i.context_value_list_id']);
651 53
                break;
652
653
            case SymbolType::NT_EXPR . ".0.0":
654
                // [ 0:NT_EXPR_ARG_OR, 1:NT_EXPR_ARG_OR_TAIL ]
655 53
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
656 53
                break;
657
658
            case SymbolType::NT_EXPR . ".0.1":
659
                // [ 0:NT_EXPR_ARG_OR, 1:NT_EXPR_ARG_OR_TAIL ]
660 53
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
661 53
                $symbols[1]['i.left_value_list_id'] = $symbols[0]['s.value_list_id'];
662 53
                break;
663
664
            case SymbolType::NT_EXPR_ARG_OR . ".0.0":
665
                // [ 0:NT_EXPR_ARG_AND, 1:NT_EXPR_ARG_AND_TAIL ]
666 53
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
667 53
                break;
668
669
            case SymbolType::NT_EXPR_ARG_OR . ".0.1":
670
                // [ 0:NT_EXPR_ARG_AND, 1:NT_EXPR_ARG_AND_TAIL ]
671 53
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
672 53
                $symbols[1]['i.left_value_list_id'] = $symbols[0]['s.value_list_id'];
673 53
                break;
674
675
            case SymbolType::NT_EXPR_ARG_OR_TAIL . ".0.2":
676
                // [ 0:T_OP_OR, 1:NT_WS_OPT, 2:NT_EXPR_ARG_OR, 3:NT_EXPR_ARG_OR_TAIL ]
677 5
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
678 5
                break;
679
680
            case SymbolType::NT_EXPR_ARG_OR_TAIL . ".0.3":
681
                // [ 0:T_OP_OR, 1:NT_WS_OPT, 2:NT_EXPR_ARG_OR, 3:NT_EXPR_ARG_OR_TAIL ]
682 5
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
683 5
                $symbols[3]['i.left_value_list_id'] = $this
684 5
                    ->queryAstBuilder
685 5
                    ->evaluateLogicalOr(
686
                        $this
687 5
                            ->queryAstBuilder
688 5
                            ->evaluate(
689 5
                                $header['i.value_list_id'],
690 5
                                $header['i.left_value_list_id']
691
                            ),
692
                        $this
693 5
                            ->queryAstBuilder
694 5
                            ->evaluate(
695 5
                                $header['i.value_list_id'],
696 5
                                $symbols[2]['s.value_list_id']
697
                            )
698
                    );
699 5
                break;
700
701
            case SymbolType::NT_EXPR_ARG_AND . ".0.0":
702
                // [ 0:NT_EXPR_ARG_COMP, 1:NT_EXPR_ARG_COMP_TAIL ]
703 53
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
704 53
                break;
705
706
            case SymbolType::NT_EXPR_ARG_AND . ".0.1":
707
                // [ 0:NT_EXPR_ARG_COMP, 1:NT_EXPR_ARG_COMP_TAIL ]
708 53
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
709 53
                $symbols[1]['i.left_value_list_id'] = $symbols[0]['s.value_list_id'];
710 53
                break;
711
712
            case SymbolType::NT_EXPR_ARG_AND_TAIL . ".0.2":
713
                // [ 0:T_OP_AND, 1:NT_WS_OPT, 2:NT_EXPR_ARG_AND, 3:NT_EXPR_ARG_AND_TAIL ]
714 5
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
715 5
                break;
716
717
            case SymbolType::NT_EXPR_ARG_AND_TAIL . ".0.3":
718
                // [ 0:T_OP_AND, 1:NT_WS_OPT, 2:NT_EXPR_ARG_AND, 3:NT_EXPR_ARG_AND_TAIL ]
719 5
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
720 5
                $symbols[3]['i.left_value_list_id'] = $this
721 5
                    ->queryAstBuilder
722 5
                    ->evaluateLogicalAnd(
723
                        $this
724 5
                            ->queryAstBuilder
725 5
                            ->evaluate(
726 5
                                $header['i.value_list_id'],
727 5
                                $header['i.left_value_list_id']
728
                            ),
729
                        $this
730 5
                            ->queryAstBuilder
731 5
                            ->evaluate(
732 5
                                $header['i.value_list_id'],
733 5
                                $symbols[2]['s.value_list_id']
734
                            )
735
                    );
736 5
                break;
737
738
            case SymbolType::NT_EXPR_ARG_COMP . ".0.1":
739
                // [ 0:T_OP_NOT, 1:NT_EXPR_ARG_SCALAR ]
740 1
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
741 1
                break;
742
743
            case SymbolType::NT_EXPR_ARG_COMP . ".1.0":
744
                // [ 0:NT_EXPR_ARG_SCALAR ]
745 52
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
746 52
                break;
747
748
            case SymbolType::NT_EXPR_ARG_SCALAR . ".0.0":
749
                // [ 0:NT_EXPR_GROUP, 1:NT_WS_OPT ]
750 4
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
751 4
                break;
752
753
            case SymbolType::NT_EXPR_ARG_SCALAR . ".1.0":
754
                // [ 0:NT_PATH, 1:NT_WS_OPT ]
755 40
                $symbols[0]['i.is_definite'] = false;
756 40
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
757 40
                break;
758
759
            case SymbolType::NT_EXPR_ARG_SCALAR . ".2.0":
760
                // [ 0:NT_INT, 1:NT_WS_OPT ]
761 13
                break;
762
763
            case SymbolType::NT_EXPR_ARG_SCALAR . ".3.0":
764
                // [ 0:NT_ARRAY, 1:NT_WS_OPT ]
765 2
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
766 2
                break;
767
768
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".0.2":
769
                // [ 0:T_OP_EQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
770
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".1.2":
771
                // [ 0:T_OP_NEQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
772
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".2.2":
773
                // [ 0:T_OP_L, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
774
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".3.2":
775
                // [ 0:T_OP_LE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
776
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".4.2":
777
                // [ 0:T_OP_G, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
778
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".5.2":
779
                // [ 0:T_OP_GE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
780 30
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
781 30
                break;
782
783
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".0.3":
784
                // [ 0:T_OP_EQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
785 21
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
786 21
                $symbols[3]['i.left_value_list_id'] = $this
787 21
                    ->queryAstBuilder
788 21
                    ->calculateIsEqual(
789 21
                        $header['i.left_value_list_id'],
790 21
                        $symbols[2]['s.value_list_id']
791
                    );
792 21
                break;
793
794
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".1.3":
795
                // [ 0:T_OP_NEQ, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
796 2
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
797 2
                $symbols[3]['i.left_value_list_id'] = $this
798 2
                    ->queryAstBuilder
799 2
                    ->evaluateLogicalNot(
800
                        $this
801 2
                            ->queryAstBuilder
802 2
                            ->calculateIsEqual(
803 2
                                $header['i.left_value_list_id'],
804 2
                                $symbols[2]['s.value_list_id']
805
                            )
806
                    );
807 2
                break;
808
809
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".2.3":
810
                // [ 0:T_OP_L, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
811 2
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
812 2
                $symbols[3]['i.left_value_list_id'] = $this
813 2
                    ->queryAstBuilder
814 2
                    ->calculateIsGreater(
815 2
                        $symbols[2]['s.value_list_id'],
816 2
                        $header['i.left_value_list_id']
817
                    );
818 2
                break;
819
820
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".3.3":
821
                // [ 0:T_OP_LE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
822 1
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
823 1
                $symbols[3]['i.left_value_list_id'] = $this
824 1
                    ->queryAstBuilder
825 1
                    ->evaluateLogicalNot(
826
                        $this
827 1
                            ->queryAstBuilder
828 1
                            ->calculateIsGreater(
829 1
                                $header['i.left_value_list_id'],
830 1
                                $symbols[2]['s.value_list_id']
831
                            )
832
                    );
833 1
                break;
834
835
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".4.3":
836
                // [ 0:T_OP_G, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
837 3
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
838 3
                $symbols[3]['i.left_value_list_id'] = $this
839 3
                    ->queryAstBuilder
840 3
                    ->calculateIsGreater(
841 3
                        $header['i.left_value_list_id'],
842 3
                        $symbols[2]['s.value_list_id']
843
                    );
844 3
                break;
845
846
            case SymbolType::NT_EXPR_ARG_COMP_TAIL . ".5.3":
847
                // [ 0:T_OP_GE, 1:NT_WS_OPT, 2:NT_EXPR_ARG_COMP, 3:NT_EXPR_ARG_COMP_TAIL ]
848 1
                $symbols[3]['i.value_list_id'] = $header['i.value_list_id'];
849 1
                $symbols[3]['i.left_value_list_id'] = $this
850 1
                    ->queryAstBuilder
851 1
                    ->evaluateLogicalNot(
852
                        $this
853 1
                            ->queryAstBuilder
854 1
                            ->calculateIsGreater(
855 1
                                $symbols[2]['s.value_list_id'],
856 1
                                $header['i.left_value_list_id']
857
                            )
858
                    );
859 1
                break;
860
861
            case SymbolType::NT_EXPR_GROUP . ".0.2":
862
                // [ 0:T_LEFT_BRACKET, 1:NT_WS_OPT, 2:NT_EXPR, 3:T_RIGHT_BRACKET ]
863 4
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
864 4
                break;
865
866
            case SymbolType::NT_STRING_LIST . ".0.2":
867
                // [ 0:NT_STRING, 1:NT_WS_OPT, 2:NT_STRING_NEXT ]
868 2
                $symbols[2]['i.text_list'] = [$symbols[0]['s.text']];
869 2
                $symbols[2]['i.is_definite'] = $header['i.is_definite'];
870 2
                break;
871
872
            case SymbolType::NT_STRING_NEXT . ".0.4":
873
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_STRING, 3:NT_WS_OPT, 4:NT_STRING_NEXT ]
874 1
                $symbols[4]['i.text_list'] = array_merge($header['i.text_list'], [$symbols[2]['s.text']]);
875 1
                $symbols[4]['i.is_definite'] = false;
876 1
                break;
877
878
            case SymbolType::NT_INT_NEXT . ".0.1":
879
                // [ 0:NT_WS_OPT, 1:NT_INT_NEXT_LIST ]
880 2
                $symbols[1]['i.int_list'] = [$header['i.int']];
881 2
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
882 2
                break;
883
884
            case SymbolType::NT_INT_NEXT_LIST . ".0.4":
885
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_INT, 3:NT_WS_OPT, 4:NT_INT_NEXT_LIST ]
886 1
                $symbols[4]['i.int_list'] = array_merge($header['i.int_list'], [$symbols[2]['s.int']]);
887 1
                $symbols[4]['i.is_definite'] = false;
888 1
                break;
889
890
            case SymbolType::NT_INT_NEXT . '.1.0':
891
                // [ 0:NT_INT_SLICE ]
892 7
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id']; // TODO: probably useless
893 7
                $symbols[0]['i.int_start'] = $header['i.int'];
894 7
                break;
895
896
            case SymbolType::NT_FILTER_LIST . ".0.1":
897
                // [ 0:T_DOT, 1:NT_DOT_FILTER ]
898 54
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
899 54
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
900 54
                $symbols[1]['i.is_path'] = $header['i.is_path'];
901 54
                break;
902
903
            case SymbolType::NT_FILTER_LIST . ".1.1":
904
                // [ 0:T_DOUBLE_DOT, 1:NT_DOUBLE_DOT_FILTER ]
905 13
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
906 13
                $symbols[1]['i.is_path'] = $header['i.is_path'];
907 13
                break;
908
909
            case SymbolType::NT_FILTER_LIST . ".2.2":
910
                // [
911
                //   0:T_LEFT_SQUARE_BRACKET,
912
                //   1:NT_WS_OPT,
913
                //   2:NT_BRACKET_FILTER,
914
                //   3:T_RIGHT_SQUARE_BRACKET,
915
                //   4:NT_FILTER_LIST
916
                // ]
917 71
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
918 71
                $symbols[2]['i.is_definite'] = $header['i.is_definite'];
919 71
                break;
920
921
            case SymbolType::NT_FILTER_LIST . ".2.4":
922
                // [
923
                //   0:T_LEFT_SQUARE_BRACKET,
924
                //   1:NT_WS_OPT,
925
                //   2:NT_BRACKET_FILTER,
926
                //   3:T_RIGHT_SQUARE_BRACKET,
927
                //   4:NT_FILTER_LIST
928
                // ]
929 71
                $symbols[4]['i.value_list_id'] = $symbols[2]['s.value_list_id'];
930 71
                $symbols[4]['i.is_definite'] = $symbols[2]['s.is_definite'];
931 71
                $symbols[4]['i.is_path'] = $header['i.is_path'];
932 71
                break;
933
934
            case SymbolType::NT_DOT_FILTER . ".0.1":
935
                // [ 0:T_NAME, 1:NT_DOT_FILTER_NEXT ]
936 51
                $symbols[1]['i.filter_name'] = $symbols[0]['s.text'];
937 51
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
938 51
                $symbols[1]['i.is_definite'] = $header['i.is_definite'];
939 51
                $symbols[1]['i.is_path'] = $header['i.is_path'];
940 51
                break;
941
942
            case SymbolType::NT_DOT_FILTER . ".1.1":
943
                // [ 0:T_STAR, 1:NT_FILTER_LIST ]
944 3
                $symbols[1]['i.value_list_id'] = $this
945 3
                    ->queryAstBuilder
946 3
                    ->fetchChildren(
947 3
                        $header['i.value_list_id'],
948 3
                        $this->queryAstBuilder->matchAnyChild($header['i.value_list_id'])
949
                    );
950 3
                $symbols[1]['i.is_definite'] = false;
951 3
                $symbols[1]['i.is_path'] = $header['i.is_path'];
952 3
                break;
953
954
            case SymbolType::NT_DOT_FILTER_NEXT . ".1.0":
955
                // [ 0:NT_FILTER_LIST ]
956 45
                $symbols[0]['i.value_list_id'] = $this
957 45
                    ->queryAstBuilder
958 45
                    ->fetchChildren(
959 45
                        $header['i.value_list_id'],
960
                        $this
961 45
                            ->queryAstBuilder
962 45
                            ->matchPropertyStrictly(
963 45
                                $this->queryAstBuilder->populateNameList(
964 45
                                    $header['i.value_list_id'],
965 45
                                    $header['i.filter_name']
966
                                )
967
                            )
968
                    );
969 45
                $symbols[0]['i.is_definite'] = $header['i.is_definite'];
970 45
                $symbols[0]['i.is_path'] = $header['i.is_path'];
971 45
                break;
972
973
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.0.1':
974
                // [ 0:T_NAME, 1:NT_FILTER_LIST ]
975 10
                $symbols[1]['i.value_list_id'] = $this
976 10
                    ->queryAstBuilder
977 10
                    ->fetchChildrenDeep(
978 10
                        $header['i.value_list_id'],
979
                        $this
980 10
                            ->queryAstBuilder
981 10
                            ->matchPropertyStrictly(
982 10
                                $this->queryAstBuilder->populateNameList(
983 10
                                    $header['i.value_list_id'],
984 10
                                    $symbols[0]['s.text']
985
                                )
986
                            )
987
                    );
988 10
                $symbols[1]['i.is_definite'] = false;
989 10
                $symbols[1]['i.is_path'] = $header['i.is_path'];
990 10
                break;
991
992
            case SymbolType::NT_DOUBLE_DOT_FILTER . '.1.1':
993
                // [ 0:T_STAR, 1:NT_FILTER_LIST ]
994 3
                $symbols[1]['i.value_list_id'] = $this
995 3
                    ->queryAstBuilder
996 3
                    ->fetchChildrenDeep(
997 3
                        $header['i.value_list_id'],
998 3
                        $this->queryAstBuilder->matchAnyChild($header['i.value_list_id'])
999
                    );
1000 3
                $symbols[1]['i.is_definite'] = false;
1001 3
                $symbols[1]['i.is_path'] = $header['i.is_path'];
1002 3
                break;
1003
1004
            case SymbolType::NT_STRING . ".0.1":
1005
            case SymbolType::NT_STRING . ".1.1":
1006 9
                $symbols[1]['i.text'] = '';
1007 9
                break;
1008
1009
            case SymbolType::NT_STRING_CONTENT . ".0.1":
1010 9
                $symbols[1]['i.text'] = $header['i.text'] . $symbols[0]['s.text'];
1011 9
                break;
1012
1013
            case SymbolType::NT_STRING_CONTENT . ".1.2":
1014
                $symbols[2]['i.text'] = $header['i.text'] . $symbols[1]['s.text'];
1015
                break;
1016
1017
            case SymbolType::NT_ARRAY . '.0.2':
1018
                // [ 0:T_LEFT_SQUARE_BRACKET, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT, 3:T_RIGHT_SQUARE_BRACKET ]
1019 2
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
1020 2
                $symbols[2]['i.array_id'] = $this
1021 2
                    ->queryAstBuilder
1022 2
                    ->createArray();
1023 2
                break;
1024
1025
            case SymbolType::NT_ARRAY_CONTENT . '.0.0':
1026
                // [ 0:NT_EXPR, 1:NT_ARRAY_CONTENT_TAIL ]
1027 2
                $symbols[0]['i.value_list_id'] = $header['i.value_list_id'];
1028 2
                break;
1029
1030
            case SymbolType::NT_ARRAY_CONTENT . '.0.1':
1031
                // [ 0:NT_EXPR, 1:NT_ARRAY_CONTENT_TAIL ]
1032 2
                $symbols[1]['i.value_list_id'] = $header['i.value_list_id'];
1033 2
                $symbols[1]['i.array_id'] = $this
1034 2
                    ->queryAstBuilder
1035 2
                    ->appendToArray($header['i.array_id'], $symbols[0]['s.value_list_id']);
1036
1037 2
                break;
1038
1039
            case SymbolType::NT_ARRAY_CONTENT_TAIL . '.0.2':
1040
                // [ 0:T_COMMA, 1:NT_WS_OPT, 2:NT_ARRAY_CONTENT ]
1041 1
                $symbols[2]['i.value_list_id'] = $header['i.value_list_id'];
1042 1
                $symbols[2]['i.array_id'] = $header['i.array_id'];
1043 1
                break;
1044
1045
            case SymbolType::NT_REGEXP . '.0.1':
1046
                // [ 0:T_SLASH, 1:NT_REGEXP_STRING, 2:T_REGEXP_MOD ]
1047 5
                $symbols[1]['i.text'] = '/';
1048 5
                break;
1049
1050
            case SymbolType::NT_REGEXP_STRING . '.0.1':
1051
                // [ 0:T_UNESCAPED, 1:NT_REGEXP_STRING ]
1052 5
                $symbols[1]['i.text'] = $header['i.text'] . $symbols[0]['s.text'];
1053 5
                break;
1054
1055
            case SymbolType::NT_REGEXP_STRING . '.1.2':
1056
                // [ 0:T_BACKSLASH, 1:NT_REGEXP_ESCAPED, 2:NT_REGEXP_STRING ]
1057 3
                $symbols[2]['i.text'] = $header['i.text'] . $symbols[1]['s.text'];
1058 3
                break;
1059
        }
1060 93
    }
1061
}
1062