Passed
Push — master ( f98fce...56ea51 )
by Edward
05:56
created

TranslationScheme::applySymbolActions()   F

Complexity

Conditions 62
Paths 62

Size

Total Lines 455
Code Lines 306

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 235
CRAP Score 62.0022

Importance

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