Completed
Push — master ( 6f77c4...e278ac )
by Edward
05:03
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 65
Paths 65

Size

Total Lines 472
Code Lines 317

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 243
CRAP Score 65.0023

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 65
eloc 317
c 1
b 0
f 0
nc 65
nop 2
dl 0
loc 472
ccs 243
cts 245
cp 0.9918
crap 65.0023
rs 3.3333

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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