Completed
Push — master ( e6b663...fd87f3 )
by Edward
06:50
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 62
Paths 62

Size

Total Lines 455
Code Lines 306

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 235
CRAP Score 62.0022

Importance

Changes 0
Metric Value
cc 62
eloc 306
nc 62
nop 2
dl 0
loc 455
ccs 235
cts 237
cp 0.9916
crap 62.0022
rs 3.3333
c 0
b 0
f 0

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