ProductionTranslationScheme::applyActions()   F
last analyzed

Complexity

Conditions 328
Paths 330

Size

Total Lines 945
Code Lines 674

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 328
eloc 674
c 1
b 0
f 0
nc 330
nop 1
dl 0
loc 945
rs 1.3666

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
2
3
declare(strict_types=1);
4
5
namespace Remorhaz\UniLex\RegExp\Grammar;
6
7
use Remorhaz\UniLex\AST\Tree;
8
use Remorhaz\UniLex\Exception;
9
use Remorhaz\UniLex\Parser\Production;
10
use Remorhaz\UniLex\RegExp\AST\NodeType;
11
12
class ProductionTranslationScheme
13
{
14
    private $tree;
15
16
    public function __construct(Tree $tree)
17
    {
18
        $this->tree = $tree;
19
    }
20
21
    /**
22
     * @param Production $production
23
     * @throws Exception
24
     */
25
    public function applyActions(Production $production): void
26
    {
27
        $header = $production->getHeaderShortcut();
28
        $symbols = $production->getSymbolListShortcut();
29
        $hash = "{$production->getHeader()->getSymbolId()}.{$production->getIndex()}";
30
        switch ($hash) {
31
            /**
32
             * Root production.
33
             */
34
            case SymbolType::NT_ROOT . ".0":
35
                // [SymbolType::NT_PARTS, SymbolType::T_EOI]
36
                $rootNode = $this
37
                    ->tree
38
                    ->getNode($symbols[0]['s.alternatives_node']);
39
                $this
40
                    ->tree
41
                    ->setRootNode($rootNode);
42
                break;
43
44
            /**
45
             * Alternative patterns.
46
             */
47
            case SymbolType::NT_PARTS . ".0":
48
                // [SymbolType::NT_PART, SymbolType::NT_ALT_PARTS]
49
                $header['s.alternatives_node'] = $symbols[1]['s.alternatives_node'];
50
                break;
51
52
            case SymbolType::NT_ALT_PARTS . ".0":
53
            case SymbolType::NT_ALT_PARTS_TAIL . ".0":
54
                // [SymbolType::NT_ALT_SEPARATOR, SymbolType::NT_PART, SymbolType::NT_ALT_PARTS_TAIL]
55
                $header['s.alternatives_node'] = $symbols[2]['s.alternatives_node'];
56
                break;
57
58
            case SymbolType::NT_ALT_PARTS . ".1":
59
                // []
60
                $header['s.alternatives_node'] = $header['i.alternative_node'];
61
                break;
62
63
            case SymbolType::NT_ALT_PARTS_TAIL . ".1":
64
                // []
65
                $header['s.alternatives_node'] = $header['i.alternatives_node'];
66
                $alternativeNode = $this
67
                    ->tree
68
                    ->getNode($header['i.alternative_node']);
69
                $this
70
                    ->tree
71
                    ->getNode($header['i.alternatives_node'])
72
                    ->addChild($alternativeNode);
73
                break;
74
75
            /**
76
             * Repeatable pattern.
77
             */
78
            case SymbolType::NT_PART . ".0":
79
                // [SymbolType::NT_ITEM, SymbolType::NT_MORE_ITEMS]
80
                $header['s.alternative_node'] = $symbols[1]['s.concatenate_node'];
81
                break;
82
83
            case SymbolType::NT_PART . ".1":
84
                // []
85
                $header['s.alternative_node'] = $this
86
                    ->tree
87
                    ->createNode(NodeType::EMPTY)
88
                    ->getId();
89
                break;
90
91
            case SymbolType::NT_MORE_ITEMS . ".0":
92
                // [SymbolType::NT_ITEM, SymbolType::NT_MORE_ITEMS_TAIL]
93
                $header['s.concatenate_node'] = $symbols[1]['s.concatenate_node'];
94
                break;
95
96
            case SymbolType::NT_MORE_ITEMS . ".1":
97
                // []
98
                $header['s.concatenate_node'] = $header['i.concatenable_node'];
99
                break;
100
101
            case SymbolType::NT_MORE_ITEMS_TAIL . ".0":
102
                // [SymbolType::NT_ITEM, SymbolType::NT_MORE_ITEMS_TAIL]
103
                $header['s.concatenate_node'] = $symbols[1]['s.concatenate_node'];
104
                break;
105
106
            case SymbolType::NT_MORE_ITEMS_TAIL . ".1":
107
                // []
108
                $header['s.concatenate_node'] = $header['i.concatenate_node'];
109
                $concatenableNode = $this
110
                    ->tree
111
                    ->getNode($header['i.concatenable_node']);
112
                $this
113
                    ->tree
114
                    ->getNode($header['i.concatenate_node'])
115
                    ->addChild($concatenableNode);
116
                break;
117
118
            case SymbolType::NT_ITEM . ".0":
119
                // [SymbolType::NT_ASSERT]
120
                $header['s.concatenable_node'] = $symbols[0]['s.assert_node'];
121
                break;
122
123
            case SymbolType::NT_ITEM . ".1":
124
                // [SymbolType::NT_ITEM_BODY, SymbolType::NT_ITEM_QUANT]
125
                $min = $symbols[1]['s.min'];
126
                $max = $symbols[1]['s.max'];
127
                $isMaxInfinite = $symbols[1]['s.is_max_infinite'];
128
                $shouldNotRepeat = 1 == $min && 1 == $max && !$isMaxInfinite;
129
                if ($shouldNotRepeat) {
130
                    $header['s.concatenable_node'] = $symbols[0]['s.repeatable_node'];
131
                    break;
132
                }
133
                $repeatableNode = $this
134
                    ->tree
135
                    ->getNode($symbols[0]['s.repeatable_node']);
136
                $repeatNode = $this
137
                    ->tree
138
                    ->createNode(NodeType::REPEAT)
139
                    ->setAttribute('min', $min)
140
                    ->setAttribute('max', $max)
141
                    ->setAttribute('is_max_infinite', $isMaxInfinite)
142
                    ->addChild($repeatableNode);
143
                $header['s.concatenable_node'] = $repeatNode->getId();
144
                break;
145
146
            case SymbolType::NT_ITEM_BODY . ".0":
147
                // [SymbolType::NT_GROUP]
148
                $header['s.repeatable_node'] = $symbols[0]['s.group_node'];
149
                break;
150
151
            case SymbolType::NT_ITEM_BODY . ".1":
152
                // [SymbolType::NT_CLASS_]
153
                $header['s.repeatable_node'] = $symbols[0]['s.class_node'];
154
                break;
155
156
            case SymbolType::NT_ITEM_BODY . ".2":
157
                // [SymbolType::NT_SYMBOL]
158
                $header['s.repeatable_node'] = $symbols[0]['s.symbol_node'];
159
                break;
160
161
            case SymbolType::NT_CLASS . ".0":
162
                // [SymbolType::NT_CLASS_START, SymbolType::NT_CLASS_BODY, SymbolType::NT_CLASS_END]
163
                $header['s.class_node'] = $symbols[1]['s.class_node'];
164
                break;
165
166
            case SymbolType::NT_CLASS_BODY . ".0":
167
                // [SymbolType::NT_CLASS_INVERTER, SymbolType::NT_FIRST_INV_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS]
168
                $header['s.class_node'] = $symbols[2]['s.class_node'];
169
                break;
170
171
            case SymbolType::NT_CLASS_BODY . ".1":
172
                // [SymbolType::NT_FIRST_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS]
173
                $header['s.class_node'] = $symbols[1]['s.class_node'];
174
                break;
175
176
            case SymbolType::NT_FIRST_CLASS_ITEM . ".0":
177
                // [SymbolType::NT_FIRST_CLASS_SYMBOL, SymbolType::NT_RANGE]
178
                $header['s.symbol_node'] = $symbols[1]['s.symbol_node'];
179
                break;
180
181
            case SymbolType::NT_FIRST_CLASS_ITEM . ".1":
182
            case SymbolType::NT_FIRST_INV_CLASS_ITEM . ".1":
183
                // [SymbolType::NT_ESC_CLASS_SYMBOL, SymbolType::NT_RANGE]
184
                $header['s.symbol_node'] = $symbols[1]['s.symbol_node'];
185
                break;
186
187
            case SymbolType::NT_FIRST_INV_CLASS_ITEM . ".0":
188
                // [SymbolType::NT_FIRST_INV_CLASS_SYMBOL, SymbolType::NT_RANGE]
189
                $header['s.symbol_node'] = $symbols[1]['s.symbol_node'];
190
                break;
191
192
            case SymbolType::NT_CLASS_ITEM . ".0":
193
                // [SymbolType::NT_CLASS_SYMBOL, SymbolType::NT_RANGE]
194
                $header['s.symbol_node'] = $symbols[1]['s.symbol_node'];
195
                break;
196
197
            case SymbolType::NT_ESC_CLASS_SYMBOL . ".0":
198
                // [SymbolType::NT_ESC, SymbolType::NT_CLASS_ESC_SEQUENCE]
199
                $header['s.symbol_node'] = $symbols[1]['s.escape_node'];
200
                break;
201
202
            case SymbolType::NT_CLASS_ESC_SEQUENCE . ".0":
203
                // [SymbolType::NT_ESC_SIMPLE]
204
                $escapeNode = $this
205
                    ->tree
206
                    ->createNode(NodeType::ESC_SIMPLE)
207
                    ->setAttribute('code', $symbols[0]['s.code']);
208
                $header['s.escape_node'] = $escapeNode->getId();
209
                break;
210
211
            case SymbolType::NT_CLASS_ESC_SEQUENCE . ".1":
212
                // [SymbolType::NT_ESC_SPECIAL]
213
                $escapeNode = $this
214
                    ->tree
215
                    ->createNode(NodeType::SYMBOL)
216
                    ->setAttribute('code', $symbols[0]['s.code']);
217
                $header['s.escape_node'] = $escapeNode->getId();
218
                break;
219
220
            case SymbolType::NT_CLASS_ESC_SEQUENCE . ".2":
221
                // [SymbolType::NT_ESC_NON_PRINTABLE]
222
                $header['s.escape_node'] = $symbols[0]['s.symbol_node'];
223
                break;
224
225
            case SymbolType::NT_CLASS_ESC_SEQUENCE . ".3":
226
                // [SymbolType::NT_ESC_PROP]
227
                $escapeNode = $this
228
                    ->tree
229
                    ->createNode(NodeType::SYMBOL_PROP)
230
                    ->setAttribute('not', false)
231
                    ->setAttribute('name', $symbols[0]['s.name']);
232
                $header['s.escape_node'] = $escapeNode->getId();
233
                break;
234
235
            case SymbolType::NT_CLASS_ESC_SEQUENCE . ".4":
236
                // [SymbolType::NT_ESC_NOT_PROP]
237
                $escapeNode = $this
238
                    ->tree
239
                    ->createNode(NodeType::SYMBOL_PROP)
240
                    ->setAttribute('not', true)
241
                    ->setAttribute('name', $symbols[0]['s.name']);
242
                $header['s.escape_node'] = $escapeNode->getId();
243
                break;
244
245
            case SymbolType::NT_CLASS_SYMBOL . ".0":
246
                // [SymbolType::NT_ESC_CLASS_SYMBOL]
247
                $header['s.symbol_node'] = $symbols[0]['s.symbol_node'];
248
                break;
249
250
            case SymbolType::NT_CLASS_SYMBOL . ".1":
251
                // [SymbolType::NT_UNESC_CLASS_SYMBOL]
252
                $symbolNode = $this
253
                    ->tree
254
                    ->createNode(NodeType::SYMBOL)
255
                    ->setAttribute('code', $symbols[0]['s.code']);
256
                $header['s.symbol_node'] = $symbolNode->getId();
257
                break;
258
259
            case SymbolType::NT_RANGE . ".0":
260
                // [SymbolType::NT_RANGE_SEPARATOR, SymbolType::NT_CLASS_SYMBOL]
261
                $startRangeNode = $this
262
                    ->tree
263
                    ->getNode($header['i.symbol_node']);
264
                $finishRangeNode = $this
265
                    ->tree
266
                    ->getNode($symbols[1]['s.symbol_node']);
267
                $symbolNode = $this
268
                    ->tree
269
                    ->createNode(NodeType::SYMBOL_RANGE)
270
                    ->addChild($startRangeNode)
271
                    ->addChild($finishRangeNode);
272
                $header['s.symbol_node'] = $symbolNode->getId();
273
                break;
274
275
            case SymbolType::NT_RANGE . ".1":
276
                // []
277
                $header['s.symbol_node'] = $header['i.symbol_node'];
278
                break;
279
280
            case SymbolType::NT_CLASS_ITEMS . ".0":
281
                // [SymbolType::NT_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS_TAIL]
282
                $header['s.class_node'] = $symbols[1]['i.class_node'];
283
                break;
284
285
            case SymbolType::NT_CLASS_ITEMS . ".1":
286
                // []
287
                $symbolNode = $this->tree->getNode($header['i.symbol_node']);
288
                $classNode = $header['i.not']
289
                    ? $this
290
                        ->tree
291
                        ->createNode(NodeType::SYMBOL_CLASS)
292
                        ->setAttribute('not', true)
293
                        ->addChild($symbolNode)
294
                    : $symbolNode;
295
                $header['s.class_node'] = $classNode->getId();
296
                break;
297
298
            case SymbolType::NT_CLASS_ITEMS_TAIL . ".0":
299
                // [SymbolType::NT_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS_TAIL]
300
                // TODO: Wierd SDD, maybe bug? Write test.
301
            case SymbolType::NT_CLASS_ITEMS_TAIL . ".1":
302
                // []
303
                $header['s.class_node'] = $header['i.class_node'];
304
                break;
305
306
307
            case SymbolType::NT_SYMBOL . ".0":
308
                // [SymbolType::NT_SYMBOL_ANY]
309
                $symbolNode = $this
310
                    ->tree
311
                    ->createNode(NodeType::SYMBOL_ANY);
312
                $header['s.symbol_node'] = $symbolNode->getId();
313
                break;
314
315
            case SymbolType::NT_SYMBOL . ".1":
316
                // [SymbolType::NT_ESC_SYMBOL]
317
                $header['s.symbol_node'] = $symbols[0]['s.escape_node'];
318
                break;
319
320
            case SymbolType::NT_SYMBOL . ".2":
321
                // [SymbolType::NT_UNESC_SYMBOL]
322
                $symbolNode = $this
323
                    ->tree
324
                    ->createNode(NodeType::SYMBOL)
325
                    ->setAttribute('code', $symbols[0]['s.code']);
326
                $header['s.symbol_node'] = $symbolNode->getId();
327
                break;
328
329
            case SymbolType::NT_GROUP . ".0":
330
                // [SymbolType::NT_GROUP_START, SymbolType::NT_PARTS, SymbolType::NT_GROUP_END]
331
                $header['s.group_node'] = $symbols[1]['s.alternatives_node'];
332
                break;
333
334
            case SymbolType::NT_ASSERT . ".0":
335
                // [SymbolType::NT_ASSERT_LINE_START]
336
                $assertNode = $this
337
                    ->tree
338
                    ->createNode(NodeType::ASSERT)
339
                    ->setAttribute('type', 'line_start');
340
                $header['s.assert_node'] = $assertNode->getId();
341
                break;
342
343
            case SymbolType::NT_ASSERT . ".1":
344
                // [SymbolType::NT_ASSERT_LINE_FINISH]
345
                $assertNode = $this
346
                    ->tree
347
                    ->createNode(NodeType::ASSERT)
348
                    ->setAttribute('type', 'line_finish');
349
                $header['s.assert_node'] = $assertNode->getId();
350
                break;
351
352
            /**
353
             * Escaped patterns.
354
             */
355
            case SymbolType::NT_ESC_SYMBOL . ".0":
356
                // [SymbolType::NT_ESC, SymbolType::NT_ESC_SEQUENCE]
357
                $header['s.escape_node'] = $symbols[1]['s.escape_node'];
358
                break;
359
360
            case SymbolType::NT_ESC_SEQUENCE . ".0":
361
                // [SymbolType::NT_ESC_SIMPLE]
362
                $escapeNode = $this
363
                    ->tree
364
                    ->createNode(NodeType::ESC_SIMPLE)
365
                    ->setAttribute('code', $symbols[0]['s.code']);
366
                $header['s.escape_node'] = $escapeNode->getId();
367
                break;
368
369
            case SymbolType::NT_ESC_SEQUENCE . ".1":
370
                // [SymbolType::NT_ESC_SPECIAL]
371
                $escapeNode = $this
372
                    ->tree
373
                    ->createNode(NodeType::SYMBOL)
374
                    ->setAttribute('code', $symbols[0]['s.code']);
375
                $header['s.escape_node'] = $escapeNode->getId();
376
                break;
377
378
            case SymbolType::NT_ESC_SEQUENCE . ".2":
379
                // [SymbolType::NT_ESC_NON_PRINTABLE]
380
                $header['s.escape_node'] = $symbols[0]['s.symbol_node'];
381
                break;
382
383
            case SymbolType::NT_ESC_SEQUENCE . ".3":
384
                // [SymbolType::NT_ESC_PROP]
385
                $escapeNode = $this
386
                    ->tree
387
                    ->createNode(NodeType::SYMBOL_PROP)
388
                    ->setAttribute('not', false)
389
                    ->setAttribute('name', $symbols[0]['s.name']);
390
                $header['s.escape_node'] = $escapeNode->getId();
391
                break;
392
393
            case SymbolType::NT_ESC_SEQUENCE . ".4":
394
                // [SymbolType::NT_ESC_NOT_PROP]
395
                $escapeNode = $this
396
                    ->tree
397
                    ->createNode(NodeType::SYMBOL_PROP)
398
                    ->setAttribute('not', true)
399
                    ->setAttribute('name', $symbols[0]['s.name']);
400
                $header['s.escape_node'] = $escapeNode->getId();
401
                break;
402
403
            case SymbolType::NT_ESC_PROP . ".0":
404
                // [SymbolType::NT_ESC_PROP_MARKER, SymbolType::NT_PROP]
405
            case SymbolType::NT_ESC_NOT_PROP . ".0":
406
                // [SymbolType::NT_ESC_NOT_PROP_MARKER, SymbolType::NT_PROP]
407
                $header['s.name'] = $symbols[1]['s.name'];
408
                break;
409
410
            case SymbolType::NT_PROP . ".0":
411
                // [SymbolType::NT_PROP_SHORT]
412
            case SymbolType::NT_PROP . ".1":
413
                // [SymbolType::NT_PROP_FULL]
414
                $header['s.name'] = $symbols[0]['s.name'];
415
                break;
416
417
418
            case SymbolType::NT_PROP_SHORT . ".0":
419
                // [SymbolType::NT_NOT_PROP_START]
420
                $header['s.name'] = [$symbols[0]['s.code']];
421
                break;
422
423
            case SymbolType::NT_PROP_FULL . ".0":
424
                // [SymbolType::NT_PROP_START, SymbolType::NT_PROP_NAME, SymbolType::NT_PROP_FINISH]
425
                $header['s.name'] = $symbols[1]['s.name'];
426
                break;
427
428
            case SymbolType::NT_PROP_NAME . ".0":
429
                // [SymbolType::NT_PROP_NAME_PART]
430
                $header['s.name'] = $symbols[0]['s.name'];
431
                break;
432
433
            case SymbolType::NT_PROP_NAME_PART . ".0":
434
                // [SymbolType::NT_NOT_PROP_FINISH, SymbolType::NT_PROP_NAME_PART]
435
                $header['s.name'] = $symbols[1]['s.name'];
436
                break;
437
438
            case SymbolType::NT_PROP_NAME_PART . ".1":
439
                // []
440
                $header['s.name'] = $header['i.name'];
441
                break;
442
443
            case SymbolType::NT_ESC_NON_PRINTABLE . ".0":
444
                // [SymbolType::NT_ESC_CTL]
445
            case SymbolType::NT_ESC_NON_PRINTABLE . ".1":
446
                // [SymbolType::NT_ESC_OCT]
447
            case SymbolType::NT_ESC_NON_PRINTABLE . ".2":
448
                // [SymbolType::NT_ESC_HEX]
449
            case SymbolType::NT_ESC_NON_PRINTABLE . ".3":
450
                // [SymbolType::NT_ESC_UNICODE]
451
                $header['s.symbol_node'] = $symbols[0]['s.symbol_node'];
452
                break;
453
454
            case SymbolType::NT_ESC_CTL . ".0":
455
                // [SymbolType::NT_ESC_CTL_MARKER, SymbolType::NT_ESC_CTL_CODE]
456
                $symbolNode = $this
457
                    ->tree
458
                    ->createNode(NodeType::SYMBOL_CTL)
459
                    ->setAttribute('code', $symbols[1]['s.code']);
460
                $header['s.symbol_node'] = $symbolNode->getId();
461
                break;
462
463
            case SymbolType::NT_ESC_CTL_CODE . ".0":
464
                // [SymbolType::NT_PRINTABLE_ASCII]
465
                $header['s.code'] = $symbols[0]['s.code'];
466
                break;
467
468
            case SymbolType::NT_ESC_OCT . ".0":
469
                // [SymbolType::NT_ESC_OCT_SHORT]
470
            case SymbolType::NT_ESC_OCT . ".1":
471
                // [SymbolType::NT_ESC_OCT_LONG]
472
                $symbolNode = $this
473
                    ->tree
474
                    ->createNode(NodeType::SYMBOL)
475
                    ->setAttribute('code', $symbols[0]['s.code']);
476
                $header['s.symbol_node'] = $symbolNode->getId();
477
                break;
478
479
            case SymbolType::NT_ESC_OCT_SHORT . ".0":
480
                // [SymbolType::NT_ESC_OCT_SHORT_MARKER]
481
                $octNumber = $symbols[0]['s.oct_digit'];
482
                $header['s.code'] = octdec($octNumber);
483
                break;
484
485
            case SymbolType::NT_ESC_OCT_SHORT_MARKER . ".0":
486
                // [SymbolType::T_DIGIT_ZERO]
487
                $header['s.oct_digit'] = $symbols[0]['s.oct_digit'];
488
                break;
489
490
            case SymbolType::NT_ESC_OCT_LONG . ".0":
491
                // [SymbolType::NT_ESC_OCT_LONG_MARKER, SymbolType::NT_ESC_OCT_LONG_NUM]
492
                $header['s.code'] = $symbols[1]['s.code'];
493
                break;
494
495
            case SymbolType::NT_ESC_OCT_LONG_NUM . ".0":
496
                // [SymbolType::NT_ESC_NUM_START, SymbolType::NT_OCT, SymbolType::NT_ESC_NUM_FINISH]
497
                $header['s.code'] = $symbols[1]['s.number_value'];
498
                break;
499
500
            case SymbolType::NT_ESC_UNICODE . ".0":
501
                // [SymbolType::NT_ESC_UNICODE_MARKER, SymbolType::NT_ESC_UNICODE_NUM]
502
                $header['s.symbol_node'] = $symbols[1]['s.symbol_node'];
503
                break;
504
505
            case SymbolType::NT_ESC_UNICODE_NUM . ".0":
506
                // [4 x SymbolType::NT_HEX_DIGIT]
507
                $hexNumberString =
508
                    $symbols[0]['s.hex_digit'] .
509
                    $symbols[1]['s.hex_digit'] .
510
                    $symbols[2]['s.hex_digit'] .
511
                    $symbols[3]['s.hex_digit'];
512
                $hexNumber = hexdec($hexNumberString);
513
                $symbolNode = $this
514
                    ->tree
515
                    ->createNode(NodeType::SYMBOL)
516
                    ->setAttribute('code', $hexNumber);
517
                $header['s.symbol_node'] = $symbolNode->getId();
518
                break;
519
520
            case SymbolType::NT_ESC_HEX . ".0":
521
                // [SymbolType::NT_ESC_HEX_MARKER, SymbolType::NT_ESC_HEX_NUM]
522
                $symbolNode = $this
523
                    ->tree
524
                    ->createNode(NodeType::SYMBOL)
525
                    ->setAttribute('code', $symbols[1]['s.code']);
526
                $header['s.symbol_node'] = $symbolNode->getId();
527
                break;
528
529
            case SymbolType::NT_ESC_HEX_NUM . ".0":
530
                // [SymbolType::NT_ESC_HEX_SHORT_NUM]
531
            case SymbolType::NT_ESC_HEX_NUM . ".1":
532
                // [SymbolType::NT_ESC_HEX_LONG_NUM]
533
                $header['s.code'] = $symbols[0]['s.code'];
534
                break;
535
536
            case SymbolType::NT_ESC_HEX_SHORT_NUM . ".0":
537
                // [SymbolType::NT_HEX_DIGIT, SymbolType::NT_HEX_DIGIT]
538
                $hexNumberString = $symbols[0]['s.hex_digit'] . $symbols[1]['s.hex_digit'];
539
                $header['s.code'] = hexdec($hexNumberString);
540
                break;
541
542
            case SymbolType::NT_ESC_HEX_LONG_NUM . ".0":
543
                // [SymbolType::NT_ESC_NUM_START, SymbolType::NT_HEX, SymbolType::NT_ESC_NUM_FINISH]
544
                $header['s.code'] = $symbols[1]['s.number_value'];
545
                break;
546
547
            /**
548
             * Repeatable pattern quantifier.
549
             */
550
            case SymbolType::NT_ITEM_QUANT . ".0":
551
                // [SymbolType::NT_ITEM_OPT]
552
                $header['s.min'] = 0;
553
                $header['s.max'] = 1;
554
                $header['s.is_max_infinite'] = false;
555
                break;
556
557
            case SymbolType::NT_ITEM_QUANT . ".1":
558
                // [SymbolType::NT_ITEM_QUANT_STAR]
559
                $header['s.min'] = 0;
560
                $header['s.max'] = 0;
561
                $header['s.is_max_infinite'] = true;
562
                break;
563
564
            case SymbolType::NT_ITEM_QUANT . ".2":
565
                // [SymbolType::NT_ITEM_QUANT_PLUS]
566
                $header['s.min'] = 1;
567
                $header['s.max'] = 0;
568
                $header['s.is_max_infinite'] = true;
569
                break;
570
571
            case SymbolType::NT_ITEM_QUANT . ".3":
572
                // [SymbolType::NT_LIMIT]
573
                $header['s.min'] = $symbols[0]['s.min'];
574
                $header['s.max'] = $symbols[0]['s.max'];
575
                $header['s.is_max_infinite'] = $symbols[0]['s.is_max_infinite'];
576
                break;
577
578
            case SymbolType::NT_ITEM_QUANT . ".4":
579
                // []
580
                $header['s.min'] = 1;
581
                $header['s.max'] = 1;
582
                $header['s.is_max_infinite'] = false;
583
                break;
584
585
            case SymbolType::NT_LIMIT . ".0":
586
                // [SymbolType::NT_LIMIT_START, SymbolType::NT_MIN, SymbolType::NT_OPT_MAX, SymbolType::NT_LIMIT_END]
587
                $header['s.min'] = $symbols[1]['s.number_value'];
588
                $header['s.max'] = $symbols[2]['s.number_value'];
589
                $header['s.is_max_infinite'] = $symbols[2]['s.is_infinite'];
590
                break;
591
592
            case SymbolType::NT_MIN . ".0":
593
                // [SymbolType::NT_DEC]
594
                $header['s.number_value'] = $symbols[0]['s.number_value'];
595
                break;
596
597
            case SymbolType::NT_MAX . ".0":
598
                // [SymbolType::NT_DEC]
599
                $header['s.number_value'] = $symbols[0]['s.number_value'];
600
                $header['s.is_infinite'] = false;
601
                break;
602
603
            case SymbolType::NT_MAX . ".1":
604
                // []
605
                $header['s.number_value'] = 0;
606
                $header['s.is_infinite'] = true;
607
                break;
608
609
            case SymbolType::NT_OPT_MAX . ".0":
610
                // [SymbolType::NT_LIMIT_SEPARATOR, SymbolType::NT_MAX]
611
                $header['s.number_value'] = $symbols[1]['s.number_value'];
612
                $header['s.is_infinite'] = $symbols[1]['s.is_infinite'];
613
                break;
614
615
            case SymbolType::NT_OPT_MAX . ".1":
616
                // []
617
                $header['s.number_value'] = $header['i.min'];
618
                $header['s.is_infinite'] = false;
619
                break;
620
621
            /**
622
             * Decimal numbers.
623
             */
624
            case SymbolType::NT_DEC . ".0":
625
                // [SymbolType::NT_DEC_DIGIT, SymbolType::NT_OPT_DEC]
626
                $number = $symbols[0]['s.dec_digit'] . $symbols[1]['s.dec_number_tail'];
627
                $header['s.number_value'] = (int) $number;
628
                break;
629
630
            case SymbolType::NT_OPT_DEC . ".0":
631
                // [SymbolType::NT_DEC_DIGIT, SymbolType::NT_OPT_DEC]
632
                $numberTail = $symbols[0]['s.dec_digit'] . $symbols[1]['s.dec_number_tail'];
633
                $header['s.dec_number_tail'] = $numberTail;
634
                break;
635
636
            case SymbolType::NT_OPT_DEC . ".1":
637
                // []
638
                $header['s.dec_number_tail'] = '';
639
                break;
640
641
            case SymbolType::NT_DEC_DIGIT . ".0":
642
                // [SymbolType::T_DIGIT_ZERO]
643
            case SymbolType::NT_DEC_DIGIT . ".1":
644
                // [SymbolType::T_DIGIT_OCT]
645
            case SymbolType::NT_DEC_DIGIT . ".2":
646
                // [SymbolType::T_DIGIT_DEC]
647
                $header['s.dec_digit'] = $symbols[0]['s.dec_digit'];
648
                break;
649
650
            /**
651
             * Octal numbers.
652
             */
653
            case SymbolType::NT_OCT . ".0":
654
                // [SymbolType::NT_DEC_DIGIT, SymbolType::NT_OPT_DEC]
655
                $number = $symbols[0]['s.oct_digit'] . $symbols[1]['s.oct_number_tail'];
656
                $header['s.number_value'] = octdec($number);
657
                break;
658
659
            case SymbolType::NT_OPT_OCT . ".0":
660
                // [SymbolType::NT_OCT_DIGIT, SymbolType::NT_OPT_OCT]
661
                $numberTail = $symbols[0]['s.oct_digit'] . $symbols[1]['s.oct_number_tail'];
662
                $header['s.oct_number_tail'] = $numberTail;
663
                break;
664
665
            case SymbolType::NT_OPT_OCT . ".1":
666
                // []
667
                $header['s.oct_number_tail'] = '';
668
                break;
669
670
            case SymbolType::NT_OCT_DIGIT . ".0":
671
                // [SymbolType::T_DIGIT_ZERO]
672
            case SymbolType::NT_OCT_DIGIT . ".1":
673
                // [SymbolType::T_DIGIT_OCT]
674
                $header['s.oct_digit'] = $symbols[0]['s.oct_digit'];
675
                break;
676
677
            /**
678
             * Hexadecimal numbers.
679
             */
680
            case SymbolType::NT_HEX . ".0":
681
                // [SymbolType::NT_HEX_DIGIT, SymbolType::NT_OPT_HEX]
682
                $hexNumber = $symbols[0]['s.hex_digit'] . $symbols[1]['s.hex_number_tail'];
683
                $header['s.number_value'] = hexdec($hexNumber);
684
                break;
685
686
            case SymbolType::NT_OPT_HEX . ".0":
687
                // [SymbolType::NT_HEX_DIGIT, SymbolType::NT_OPT_HEX]
688
                $numberTail = $symbols[0]['s.hex_digit'] . $symbols[1]['s.hex_number_tail'];
689
                $header['s.hex_number_tail'] = $numberTail;
690
                break;
691
692
            case SymbolType::NT_OPT_HEX . ".1":
693
                // []
694
                $header['s.hex_number_tail'] = '';
695
                break;
696
697
            case SymbolType::NT_HEX_DIGIT . ".0":
698
                // [SymbolType::T_DIGIT_ZERO]
699
            case SymbolType::NT_HEX_DIGIT . ".1":
700
                // [SymbolType::T_DIGIT_OCT]
701
            case SymbolType::NT_HEX_DIGIT . ".2":
702
                // [SymbolType::T_DIGIT_DEC]
703
            case SymbolType::NT_HEX_DIGIT . ".3":
704
                // [SymbolType::T_SMALL_C]
705
            case SymbolType::NT_HEX_DIGIT . ".4":
706
                // [SymbolType::T_OTHER_HEX_LETTER]
707
                $header['s.hex_digit'] = $symbols[0]['s.hex_digit'];
708
                break;
709
710
            /**
711
             * Printable ASCII symbols.
712
             */
713
            case SymbolType::NT_PRINTABLE_ASCII . ".0":
714
                // [SymbolType::NT_META_CHAR]
715
            case SymbolType::NT_PRINTABLE_ASCII . ".1":
716
                // [SymbolType::NT_DEC_DIGIT]
717
            case SymbolType::NT_PRINTABLE_ASCII . ".2":
718
                // [SymbolType::NT_ASCII_LETTER]
719
            case SymbolType::NT_PRINTABLE_ASCII . ".3":
720
                // [SymbolType::NT_PRINTABLE_ASCII_OTHER]
721
                $header['s.code'] = $symbols[0]['s.code'];
722
                break;
723
724
            /**
725
             * Non-terminal symbols with code.
726
             */
727
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".0":
728
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".0":
729
            case SymbolType::NT_ESC_SPECIAL . ".10":
730
            case SymbolType::NT_NOT_PROP_START . ".15":
731
            case SymbolType::NT_NOT_PROP_FINISH . ".15":
732
            case SymbolType::NT_UNESC_SYMBOL . ".6":
733
            case SymbolType::NT_META_CHAR . ".11":
734
                // [SymbolType::T_RIGHT_SQUARE_BRACKET]
735
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".1":
736
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".1":
737
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".0":
738
            case SymbolType::NT_ESC_SPECIAL . ".0":
739
            case SymbolType::NT_NOT_PROP_START . ".0":
740
            case SymbolType::NT_NOT_PROP_FINISH . ".0":
741
            case SymbolType::NT_META_CHAR . ".0":
742
                // [SymbolType::T_DOLLAR]
743
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".2":
744
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".2":
745
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".1":
746
            case SymbolType::NT_ESC_SPECIAL . ".1":
747
            case SymbolType::NT_NOT_PROP_START . ".1":
748
            case SymbolType::NT_NOT_PROP_FINISH . ".1":
749
            case SymbolType::NT_META_CHAR . ".1":
750
                // [SymbolType::T_LEFT_BRACKET]
751
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".3":
752
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".3":
753
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".2":
754
            case SymbolType::NT_ESC_SPECIAL . ".2":
755
            case SymbolType::NT_NOT_PROP_START . ".2":
756
            case SymbolType::NT_NOT_PROP_FINISH . ".2":
757
            case SymbolType::NT_META_CHAR . ".2":
758
                // [SymbolType::T_RIGHT_BRACKET]
759
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".4":
760
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".4":
761
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".3":
762
            case SymbolType::NT_ESC_SPECIAL . ".3":
763
            case SymbolType::NT_NOT_PROP_START . ".3":
764
            case SymbolType::NT_NOT_PROP_FINISH . ".3":
765
            case SymbolType::NT_META_CHAR . ".3":
766
                // [SymbolType::T_STAR]
767
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".5":
768
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".5":
769
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".4":
770
            case SymbolType::NT_ESC_SPECIAL . ".4":
771
            case SymbolType::NT_NOT_PROP_START . ".4":
772
            case SymbolType::NT_NOT_PROP_FINISH . ".4":
773
            case SymbolType::NT_META_CHAR . ".4":
774
                // [SymbolType::T_PLUS]
775
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".6":
776
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".6":
777
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".5":
778
            case SymbolType::NT_ESC_SPECIAL . ".5":
779
            case SymbolType::NT_NOT_PROP_START . ".5":
780
            case SymbolType::NT_NOT_PROP_FINISH . ".5":
781
            case SymbolType::NT_UNESC_SYMBOL . ".0":
782
            case SymbolType::NT_META_CHAR . ".5":
783
                // [SymbolType::T_COMMA]
784
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".7":
785
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".7":
786
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".6":
787
            case SymbolType::NT_ESC_SPECIAL . ".7":
788
            case SymbolType::NT_NOT_PROP_START . ".11":
789
            case SymbolType::NT_NOT_PROP_FINISH . ".11":
790
            case SymbolType::NT_META_CHAR . ".8":
791
                // [SymbolType::T_QUESTION]
792
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".8":
793
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".8":
794
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".7":
795
            case SymbolType::NT_ESC_SPECIAL . ".8":
796
            case SymbolType::NT_NOT_PROP_START . ".13":
797
            case SymbolType::NT_NOT_PROP_FINISH . ".13":
798
            case SymbolType::NT_META_CHAR . ".9":
799
                // [SymbolType::T_LEFT_SQUARE_BRACKET]
800
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".9":
801
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".9":
802
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".9":
803
            case SymbolType::NT_ESC_SPECIAL . ".12":
804
            case SymbolType::NT_NOT_PROP_FINISH . ".22":
805
            case SymbolType::NT_META_CHAR . ".13":
806
                // [SymbolType::T_LEFT_CURLY_BRACKET]
807
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".10":
808
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".10":
809
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".10":
810
            case SymbolType::NT_ESC_SPECIAL . ".13":
811
            case SymbolType::NT_NOT_PROP_START . ".22":
812
            case SymbolType::NT_NOT_PROP_FINISH . ".23":
813
            case SymbolType::NT_META_CHAR . ".14":
814
                // [SymbolType::T_VERTICAL_LINE]
815
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".11":
816
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".11":
817
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".11":
818
            case SymbolType::NT_ESC_SPECIAL . ".14":
819
            case SymbolType::NT_NOT_PROP_START . ".23":
820
            case SymbolType::NT_UNESC_SYMBOL . ".12":
821
            case SymbolType::NT_META_CHAR . ".15":
822
                // [SymbolType::T_RIGHT_CURLY_BRACKET]
823
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".12":
824
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".12":
825
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".12":
826
            case SymbolType::NT_ESC_SPECIAL . ".15":
827
            case SymbolType::NT_NOT_PROP_START . ".24":
828
            case SymbolType::NT_NOT_PROP_FINISH . ".24":
829
            case SymbolType::NT_UNESC_SYMBOL . ".13":
830
                // [SymbolType::T_CTL_ASCII]
831
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".13":
832
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".13":
833
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".13":
834
            case SymbolType::NT_ESC_SIMPLE . ".1":
835
            case SymbolType::NT_NOT_PROP_START . ".25":
836
            case SymbolType::NT_NOT_PROP_FINISH . ".25":
837
            case SymbolType::NT_UNESC_SYMBOL . ".14":
838
            case SymbolType::NT_ASCII_LETTER . ".7":
839
                // [SymbolType::T_OTHER_HEX_LETTER]
840
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".14":
841
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".14":
842
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".14":
843
            case SymbolType::NT_ESC_SIMPLE . ".0":
844
            case SymbolType::NT_NOT_PROP_START . ".26":
845
            case SymbolType::NT_NOT_PROP_FINISH . ".26":
846
            case SymbolType::NT_UNESC_SYMBOL . ".15":
847
            case SymbolType::NT_ASCII_LETTER . ".6":
848
                // [SymbolType::T_OTHER_ASCII_LETTER]
849
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".15":
850
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".15":
851
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".15":
852
            case SymbolType::NT_ESC_SPECIAL . ".16":
853
            case SymbolType::NT_NOT_PROP_START . ".27":
854
            case SymbolType::NT_NOT_PROP_FINISH . ".27":
855
            case SymbolType::NT_UNESC_SYMBOL . ".16":
856
            case SymbolType::NT_PRINTABLE_ASCII_OTHER . ".0":
857
                // [SymbolType::T_PRINTABLE_ASCII_OTHER]
858
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".16":
859
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".16":
860
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".16":
861
            case SymbolType::NT_ESC_SPECIAL . ".17":
862
            case SymbolType::NT_NOT_PROP_START . ".28":
863
            case SymbolType::NT_NOT_PROP_FINISH . ".28":
864
            case SymbolType::NT_UNESC_SYMBOL . ".17":
865
                // [SymbolType::T_OTHER_ASCII]
866
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".17":
867
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".17":
868
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".17":
869
            case SymbolType::NT_ESC_SPECIAL . ".18":
870
            case SymbolType::NT_NOT_PROP_START . ".29":
871
            case SymbolType::NT_NOT_PROP_FINISH . ".29":
872
            case SymbolType::NT_UNESC_SYMBOL . ".18":
873
                // [SymbolType::T_NOT_ASCII]
874
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".18":
875
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".8":
876
            case SymbolType::NT_ESC_SPECIAL . ".11":
877
            case SymbolType::NT_NOT_PROP_START . ".16":
878
            case SymbolType::NT_NOT_PROP_FINISH . ".16":
879
            case SymbolType::NT_META_CHAR . ".12":
880
                // [SymbolType::T_CIRCUMFLEX]
881
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".18":
882
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".19":
883
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".18":
884
            case SymbolType::NT_NOT_PROP_START . ".12":
885
            case SymbolType::NT_NOT_PROP_FINISH . ".12":
886
            case SymbolType::NT_UNESC_SYMBOL . ".5":
887
            case SymbolType::NT_ASCII_LETTER . ".0":
888
                // [SymbolType::T_CAPITAL_P]
889
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".19":
890
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".20":
891
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".19":
892
            case SymbolType::NT_NOT_PROP_START . ".17":
893
            case SymbolType::NT_NOT_PROP_FINISH . ".17":
894
            case SymbolType::NT_UNESC_SYMBOL . ".7":
895
            case SymbolType::NT_ASCII_LETTER . ".1":
896
                // [SymbolType::T_SMALL_C]
897
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".20":
898
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".21":
899
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".20":
900
            case SymbolType::NT_NOT_PROP_START . ".18":
901
            case SymbolType::NT_NOT_PROP_FINISH . ".18":
902
            case SymbolType::NT_UNESC_SYMBOL . ".8":
903
            case SymbolType::NT_ASCII_LETTER . ".2":
904
                // [SymbolType::T_SMALL_O]
905
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".21":
906
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".22":
907
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".21":
908
            case SymbolType::NT_NOT_PROP_START . ".19":
909
            case SymbolType::NT_NOT_PROP_FINISH . ".19":
910
            case SymbolType::NT_UNESC_SYMBOL . ".9":
911
            case SymbolType::NT_ASCII_LETTER . ".3":
912
                // [SymbolType::T_SMALL_P]
913
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".22":
914
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".23":
915
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".22":
916
            case SymbolType::NT_NOT_PROP_START . ".20":
917
            case SymbolType::NT_NOT_PROP_FINISH . ".20":
918
            case SymbolType::NT_UNESC_SYMBOL . ".10":
919
            case SymbolType::NT_ASCII_LETTER . ".4":
920
                // [SymbolType::T_SMALL_U]
921
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".23":
922
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".24":
923
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".23":
924
            case SymbolType::NT_NOT_PROP_START . ".21":
925
            case SymbolType::NT_NOT_PROP_FINISH . ".21":
926
            case SymbolType::NT_UNESC_SYMBOL . ".11":
927
            case SymbolType::NT_ASCII_LETTER . ".5":
928
                // [SymbolType::T_SMALL_X]
929
            case SymbolType::NT_ESC_SIMPLE . ".2":
930
            case SymbolType::NT_NOT_PROP_START . ".9":
931
            case SymbolType::NT_NOT_PROP_FINISH . ".9":
932
            case SymbolType::NT_UNESC_SYMBOL . ".3":
933
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".25":
934
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".26":
935
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".25":
936
                // [SymbolType::T_DIGIT_OCT]
937
            case SymbolType::NT_ESC_SIMPLE . ".3":
938
            case SymbolType::NT_NOT_PROP_START . ".10":
939
            case SymbolType::NT_NOT_PROP_FINISH . ".10":
940
            case SymbolType::NT_UNESC_SYMBOL . ".4":
941
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".26":
942
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".27":
943
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".26":
944
                // [SymbolType::T_DIGIT_DEC]
945
            case SymbolType::NT_ESC_SPECIAL . ".6":
946
            case SymbolType::NT_NOT_PROP_START . ".6":
947
            case SymbolType::NT_NOT_PROP_FINISH . ".6":
948
            case SymbolType::NT_META_CHAR . ".6":
949
                // [SymbolType::T_HYPHEN]
950
            case SymbolType::NT_ESC_SPECIAL . ".9":
951
            case SymbolType::NT_NOT_PROP_START . ".14":
952
            case SymbolType::NT_NOT_PROP_FINISH . ".14":
953
            case SymbolType::NT_UNESC_SYMBOL . ".1":
954
            case SymbolType::NT_META_CHAR . ".10":
955
                // [SymbolType::T_BACKSLASH]
956
            case SymbolType::NT_NOT_PROP_START . ".7":
957
            case SymbolType::NT_NOT_PROP_FINISH . ".7":
958
            case SymbolType::NT_META_CHAR . ".7":
959
            case SymbolType::NT_ESC_SPECIAL . ".19":
960
                // [SymbolType::T_DOT]
961
            case SymbolType::NT_NOT_PROP_START . ".8":
962
            case SymbolType::NT_NOT_PROP_FINISH . ".8":
963
            case SymbolType::NT_UNESC_SYMBOL . ".2":
964
            case SymbolType::NT_FIRST_CLASS_SYMBOL . ".24":
965
            case SymbolType::NT_FIRST_INV_CLASS_SYMBOL . ".25":
966
            case SymbolType::NT_UNESC_CLASS_SYMBOL . ".24":
967
                // [SymbolType::T_DIGIT_ZERO]
968
                $header['s.code'] = $symbols[0]['s.code'];
969
                break;
970
        }
971
    }
972
}
973