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

TranslationScheme::applyProductionActions()   F

Complexity

Conditions 85
Paths 85

Size

Total Lines 504
Code Lines 332

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 315
CRAP Score 85.3571

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 85
eloc 332
c 1
b 0
f 0
nc 85
nop 1
dl 0
loc 504
ccs 315
cts 327
cp 0.9633
crap 85.3571
rs 3.3333

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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