Completed
Push — master ( 454097...1eefea )
by Edward
05:21
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 70
Paths 70

Size

Total Lines 505
Code Lines 346

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 267
CRAP Score 70.0019

Importance

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