Skip to content

Commit 492f9b8

Browse files
mvorisekondrejmirtes
authored andcommittedMay 30, 2023
Add general "+" sign support for integer/float numbers
1 parent 8e75539 commit 492f9b8

File tree

4 files changed

+32
-10
lines changed

4 files changed

+32
-10
lines changed
 

‎doc/grammars/type.abnf

+12-8
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,18 @@ ConstantExpr
8585
/ ConstantFetch *ByteHorizontalWs
8686

8787
ConstantFloat
88-
= ["-"] 1*ByteDecDigit *("_" 1*ByteDecDigit) "." [1*ByteDecDigit *("_" 1*ByteDecDigit)] [ConstantFloatExp]
89-
/ ["-"] 1*ByteDecDigit *("_" 1*ByteDecDigit) ConstantFloatExp
90-
/ ["-"] "." 1*ByteDecDigit *("_" 1*ByteDecDigit) [ConstantFloatExp]
88+
= [ByteNumberSign] 1*ByteDecDigit *("_" 1*ByteDecDigit) "." [1*ByteDecDigit *("_" 1*ByteDecDigit)] [ConstantFloatExp]
89+
/ [ByteNumberSign] 1*ByteDecDigit *("_" 1*ByteDecDigit) ConstantFloatExp
90+
/ [ByteNumberSign] "." 1*ByteDecDigit *("_" 1*ByteDecDigit) [ConstantFloatExp]
9191

9292
ConstantFloatExp
93-
= "e" ["+" / "-"] 1*ByteDecDigit *("_" 1*ByteDecDigit)
93+
= "e" [ByteNumberSign] 1*ByteDecDigit *("_" 1*ByteDecDigit)
9494

9595
ConstantInt
96-
= ["-"] "0b" 1*ByteBinDigit *("_" 1*ByteBinDigit)
97-
/ ["-"] "0o" 1*ByteOctDigit *("_" 1*ByteOctDigit)
98-
/ ["-"] "0x" 1*ByteHexDigit *("_" 1*ByteHexDigit)
99-
/ ["-"] 1*ByteDecDigit *("_" 1*ByteDecDigit)
96+
= [ByteNumberSign] "0b" 1*ByteBinDigit *("_" 1*ByteBinDigit)
97+
/ [ByteNumberSign] "0o" 1*ByteOctDigit *("_" 1*ByteOctDigit)
98+
/ [ByteNumberSign] "0x" 1*ByteHexDigit *("_" 1*ByteHexDigit)
99+
/ [ByteNumberSign] 1*ByteDecDigit *("_" 1*ByteDecDigit)
100100

101101
ConstantTrue
102102
= "true"
@@ -213,6 +213,10 @@ ByteHorizontalWs
213213
= %x09 ; horizontal tab
214214
/ %x20 ; space
215215

216+
ByteNumberSign
217+
= "+"
218+
/ "-"
219+
216220
ByteBinDigit
217221
= %x30-31 ; 0-1
218222

‎src/Lexer/Lexer.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ private function generateRegexp(): string
160160
self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+',
161161
self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?',
162162

163-
self::TOKEN_FLOAT => '(?:-?[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+-]?[0-9]++(_[0-9]++)*)?)|(?:-?[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+-]?[0-9]++(_[0-9]++)*)?)|(?:-?[0-9]++(_[0-9]++)*e[+-]?[0-9]++(_[0-9]++)*)',
164-
self::TOKEN_INTEGER => '-?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))',
163+
self::TOKEN_FLOAT => '[+\-]?(?:(?:[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]++(_[0-9]++)*e[+\-]?[0-9]++(_[0-9]++)*))',
164+
self::TOKEN_INTEGER => '[+\-]?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))',
165165
self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'',
166166
self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"',
167167

‎tests/PHPStan/Parser/ConstExprParserTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ public function provideIntegerNodeParseData(): Iterator
152152
new ConstExprIntegerNode('123'),
153153
];
154154

155+
yield [
156+
'+123',
157+
new ConstExprIntegerNode('+123'),
158+
];
159+
155160
yield [
156161
'-123',
157162
new ConstExprIntegerNode('-123'),
@@ -236,6 +241,11 @@ public function provideFloatNodeParseData(): Iterator
236241
new ConstExprFloatNode('12.3e4'),
237242
];
238243

244+
yield [
245+
'+123.5',
246+
new ConstExprFloatNode('+123.5'),
247+
];
248+
239249
yield [
240250
'-123.',
241251
new ConstExprFloatNode('-123.'),

‎tests/PHPStan/Parser/TypeParserTest.php

+8
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,14 @@ public function provideParseData(): array
10951095
'123_456.789_012',
10961096
new ConstTypeNode(new ConstExprFloatNode('123456.789012')),
10971097
],
1098+
[
1099+
'+0x10_20|+8e+2 | -0b11',
1100+
new UnionTypeNode([
1101+
new ConstTypeNode(new ConstExprIntegerNode('+0x1020')),
1102+
new ConstTypeNode(new ConstExprFloatNode('+8e+2')),
1103+
new ConstTypeNode(new ConstExprIntegerNode('-0b11')),
1104+
]),
1105+
],
10981106
[
10991107
'18_446_744_073_709_551_616|8.2023437675747321e-18_446_744_073_709_551_617',
11001108
new UnionTypeNode([

0 commit comments

Comments
 (0)
Please sign in to comment.