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

TranslationScheme::applyTokenActions()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 12
nc 5
nop 2
dl 0
loc 15
ccs 9
cts 9
cp 1
crap 5
rs 9.5555
c 0
b 0
f 0
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