Completed
Push — master ( 113bfa...89e2e4 )
by Edward
07:06
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.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