TranslationScheme::applySymbolActions()   F
last analyzed

Complexity

Conditions 72
Paths 72

Size

Total Lines 526
Code Lines 362

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 349
CRAP Score 72.0009

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 72
eloc 362
nc 72
nop 2
dl 0
loc 526
ccs 349
cts 351
cp 0.9943
crap 72.0009
rs 3.3333
c 3
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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