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