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

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 68
Paths 68

Size

Total Lines 491
Code Lines 336

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 259
CRAP Score 68.0021

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 68
eloc 336
c 3
b 0
f 0
nc 68
nop 2
dl 0
loc 491
ccs 259
cts 261
cp 0.9923
crap 68.0021
rs 3.3333

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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