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