Completed
Push — master ( 0acfd1...8c96cb )
by Edward
08:27
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 62
Paths 62

Size

Total Lines 455
Code Lines 306

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 235
CRAP Score 62.0022

Importance

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