Completed
Push — master ( b2821f...db0fbd )
by Kirill
02:29
created

Parser::rules()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 72
Code Lines 67

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 72
ccs 0
cts 70
cp 0
rs 9.102
c 0
b 0
f 0
cc 1
eloc 67
nc 1
nop 0
crap 2

How to fix   Long Method   

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
 * This file is part of Railt package.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
declare(strict_types=1);
9
10
namespace Railt\Compiler\Grammar\PP2;
11
12
use Railt\Io\Readable;
13
use Railt\Parser\Ast\RuleInterface;
14
use Railt\Parser\Configuration;
15
use Railt\Parser\Parser as LLParser;
16
use Railt\Parser\ParserInterface;
17
use Railt\Parser\Rule\Alternation;
18
use Railt\Parser\Rule\Concatenation;
19
use Railt\Parser\Rule\Repetition;
20
use Railt\Parser\Rule\Token;
21
22
/**
23
 * Class Parser
24
 */
25
class Parser implements ParserInterface
26
{
27
    /**
28
     * @var ParserInterface
29
     */
30
    private $llk;
31
32
    /**
33
     * Parser constructor.
34
     */
35
    public function __construct()
36
    {
37
        $this->llk = new LLParser(new Lexer(), $this->rules(), $this->options());
0 ignored issues
show
Documentation introduced by
$this->rules() is of type array, but the function expects a object<Railt\Parser\iterable>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
38
    }
39
40
    /**
41
     * @return array
42
     */
43
    private function rules(): array
44
    {
45
        return [
46
            // 0
47
            new Repetition(1, 0, -1, [6], 'Grammar'),
48
            new Token(2, 'T_PRAGMA', true),
49
            new Token(3, 'T_TOKEN', true),
50
            new Token(4, 'T_SKIP', true),
51
            new Token(5, 'T_INCLUDE', true),
52
            new Alternation(6, [2, 3, 4, 5, 7,], null),
53
            new Concatenation(7, [12, 19,], 'Rule'),
54
            new Repetition(8, 0, 1, [17,], null),
55
            new Token(9, 'T_NAME', true),
56
            new Repetition(10, 0, 1, [15,], null),
57
            new Token(11, 'T_COLON', false),
58
            new Concatenation(12, [8, 9, 10, 11,], 'Name'),
59
            new Token(13, 'T_DELEGATE', false),
60
            new Token(14, 'T_NAME', true),
61
            new Concatenation(15, [13, 14,], 'Delegate'),
62
            new Token(16, 'T_KEPT_NAME', false),
63
            new Concatenation(17, [16,], 'ShouldKeep'),
64
            new Repetition(18, 1, -1, [20,], null),
65
            new Concatenation(19, [18,], 'Production'),
66
            new Alternation(20, [33, 66, 36, 24, 23,], null),
67
            new Token(21, 'T_KEPT_NAME', false),
68
            new Token(22, 'T_NAME', true),
69
            new Concatenation(23, [21, 22,], 'Rename'),
70
            new Alternation(24, [32, 28,], null),
71
            new Token(25, 'T_GROUP_OPEN', false),
72
            new Repetition(26, 1, -1, [20,], null),
73
            new Token(27, 'T_GROUP_CLOSE', false),
74
            new Concatenation(28, [25, 26, 27,], null),
75
            new Token(29, 'T_KEPT', true),
76
            new Token(30, 'T_SKIPPED', true),
77
            new Token(31, 'T_INVOKE', true),
78
            new Alternation(32, [29, 30, 31,], null),
79
            new Repetition(33, 2, -1, [24,], 'Concatenation'),
80
            // 34
81
            new Repetition(35, 1, -1, [24,], null),
82
            new Concatenation(36, [35, 44,], 'Repetition'),
83
            new Token(37, 'T_ZERO_OR_ONE', true),
84
            new Concatenation(38, [37,], 'RepetitionInterval'),
85
            new Token(39, 'T_ONE_OR_MORE', true),
86
            new Concatenation(40, [39,], 'RepetitionInterval'),
87
            new Token(41, 'T_ZERO_OR_MORE', true),
88
            new Concatenation(42, [41,], 'RepetitionInterval'),
89
            new Concatenation(43, [48,], 'RepetitionInterval'),
90
            new Alternation(44, [38, 40, 42, 43,], null),
91
            new Token(45, 'T_REPETITION_OPEN', false),
92
            new Alternation(46, [52, 54,], null),
93
            new Token(47, 'T_REPETITION_CLOSE', false),
94
            new Concatenation(48, [45, 46, 47,], null),
95
            new Repetition(49, 0, 1, [56,], null),
96
            new Token(50, 'T_COMMA', false),
97
            new Repetition(51, 0, 1, [58,], null),
98
            new Concatenation(52, [49, 50, 51,], null),
99
            new Token(53, 'T_NUMBER', true),
100
            new Concatenation(54, [53,], 'Repeat'),
101
            new Token(55, 'T_NUMBER', true),
102
            new Concatenation(56, [55,], 'From'),
103
            new Token(57, 'T_NUMBER', true),
104
            new Concatenation(58, [57,], 'To'),
105
            new Concatenation(59, [33,], 'Alternation'),
106
            new Concatenation(60, [24,], 'Alternation'),
107
            new Alternation(61, [59, 60,], null),
108
            new Token(62, 'T_OR', false),
109
            new Alternation(63, [33, 24,], null),
110
            new Concatenation(64, [62, 63,], null),
111
            new Repetition(65, 1, -1, [64,], null),
112
            new Concatenation(66, [61, 65,], null),
113
        ];
114
    }
115
116
    /**
117
     * @return array
118
     */
119
    private function options(): array
120
    {
121
        return [
122
            Configuration::PRAGMA_ROOT      => 'Grammar',
123
            Configuration::PRAGMA_LOOKAHEAD => 1024,
124
        ];
125
    }
126
127
    /**
128
     * @param Readable $input
129
     * @return RuleInterface
130
     * @throws \LogicException
131
     * @throws \Railt\Io\Exception\ExternalFileException
132
     * @throws \Railt\Parser\Exception\UnrecognizedRuleException
133
     */
134
    public function parse(Readable $input): RuleInterface
135
    {
136
        return $this->llk->parse($input);
137
    }
138
}
139