Passed
Push — master ( bae1fe...e6b663 )
by Edward
04:30
created

TranslationScheme::applyTokenActions()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 14
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5

Importance

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