Completed
Push — master ( 52ec54...ba2d48 )
by Edward
04:43
created

TranslationScheme   F

Complexity

Total Complexity 153

Size/Duplication

Total Lines 1000
Duplicated Lines 0 %

Test Coverage

Coverage 97.57%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 651
c 1
b 0
f 0
dl 0
loc 1000
ccs 563
cts 577
cp 0.9757
rs 1.949
wmc 153

4 Methods

Rating   Name   Duplication   Size   Complexity  
A applyTokenActions() 0 14 5
A __construct() 0 3 1
F applyProductionActions() 0 504 85
F applySymbolActions() 0 455 62

How to fix   Complexity   

Complex Class

Complex classes like TranslationScheme often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use TranslationScheme, and based on these observations, apply Extract Interface, too.

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