Completed
Push — master ( fc2846...345204 )
by Edward
04:47
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 63
Paths 63

Size

Total Lines 460
Code Lines 309

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 237
CRAP Score 63.0023

Importance

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