Completed
Push — master ( 6f77c4...e278ac )
by Edward
05:03
created

TranslationScheme::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

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