Completed
Push — master ( 1cfdcc...36fb2a )
by Edward
05:21
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 72
Paths 72

Size

Total Lines 526
Code Lines 362

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 279
CRAP Score 72.0018

Importance

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