Completed
Push — master ( e278ac...454097 )
by Edward
05:17
created

TranslationScheme::applyTokenActions()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5

Importance

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