Completed
Push — master ( 9f742e...1cfdcc )
by Edward
05:49
created

TranslationScheme::applyProductionActions()   F

Complexity

Conditions 96
Paths 96

Size

Total Lines 565
Code Lines 373

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 356
CRAP Score 96.3192

Importance

Changes 4
Bugs 0 Features 0
Metric Value
cc 96
eloc 373
c 4
b 0
f 0
nc 96
nop 1
dl 0
loc 565
ccs 356
cts 368
cp 0.9674
crap 96.3192
rs 3.3333

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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