Skip to content

Commit 1f9f289

Browse files
author
Kirill Nesmeyanov
committed
Improve grammar for literals
1 parent 499effe commit 1f9f289

File tree

5 files changed

+67
-41
lines changed

5 files changed

+67
-41
lines changed

resources/grammar/lexemes.pp2

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33

44
%token T_DQ_STRING_LITERAL "([^"\\]*(?:\\.[^"\\]*)*)"
55
%token T_SQ_STRING_LITERAL '([^'\\]*(?:\\.[^'\\]*)*)'
6-
%token T_FLOAT_LITERAL (?i)(?:-?[0-9]++\.[0-9]*+(?:e-?[0-9]++)?)|(?:-?[0-9]*+\.[0-9]++(?:e-?[0-9]++)?)|(?:-?[0-9]++e-?[0-9]++)
7-
%token T_INT_LITERAL \-?(?i)(?:(?:0b[0-1_]++)|(?:0o[0-7_]++)|(?:0x[0-9a-f_]++)|(?:[0-9][0-9_]*+))
6+
%token T_PFX_FLOAT_LITERAL \-?(?i)[0-9]++\.[0-9]*+(?:e-?[0-9]++)?
7+
%token T_SFX_FLOAT_LITERAL \-?(?i)[0-9]*+\.[0-9]++(?:e-?[0-9]++)?
8+
%token T_EXP_LITERAL \-?(?i)[0-9]++e-?[0-9]++
9+
%token T_BIN_INT_LITERAL \-?(?i)0b[0-1_]++
10+
%token T_OCT_INT_LITERAL \-?(?i)0o[0-7_]++
11+
%token T_HEX_INT_LITERAL \-?(?i)0x[0-9a-f_]++
12+
%token T_DEC_INT_LITERAL \-?(?i)[0-9][0-9_]*+
813
%token T_BOOL_LITERAL (?i)(?:true|false)(?![a-zA-Z0-9\-_\x80-\xff])
914
%token T_NULL_LITERAL (?i)(?:null)(?![a-zA-Z0-9\-_\x80-\xff])
1015

resources/grammar/literals.pp2

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@ SingleQuotedStringLiteral -> {
3636
FloatLiteral -> {
3737
return Node\Literal\FloatLiteralNode::parse($token->getValue());
3838
}
39-
: <T_FLOAT_LITERAL>
39+
: <T_PFX_FLOAT_LITERAL>
40+
| <T_SFX_FLOAT_LITERAL>
41+
| <T_EXP_LITERAL>
4042
;
4143

4244
IntLiteral -> {
4345
return $this->integerPool[$token] ??= Node\Literal\IntLiteralNode::parse($token->getValue());
4446
}
45-
: <T_INT_LITERAL>
47+
: <T_BIN_INT_LITERAL>
48+
| <T_OCT_INT_LITERAL>
49+
| <T_HEX_INT_LITERAL>
50+
| <T_DEC_INT_LITERAL>
4651
;
4752

4853
BoolLiteral -> {

src/Node/Stmt/Callable/ParameterNode.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ public function __construct(
1616
public bool $output = false,
1717
public bool $variadic = false,
1818
public bool $optional = false,
19-
) {}
19+
) {
20+
assert($type !== null || $name !== null, new \TypeError(
21+
'Required indication of the type or name of the parameter (one of)',
22+
));
23+
}
2024

2125
public function is(string $class): bool
2226
{

tests/Unit/LiteralsTest.php

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,36 @@ public static function floatLiteralsDataProvider(): array
8585
public static function intLiteralsDataProvider(): array
8686
{
8787
return [
88-
'1234' => ['1234', 1234],
89-
'-1234' => ['-1234', -1234],
90-
'1_234_567' => ['1_234_567', 1_234_567],
91-
'-1_234_567' => ['-1_234_567', -1_234_567],
92-
'0123' => ['0123', 0123],
93-
'-0123' => ['-0123', -0123],
94-
'0o123' => ['0o123', 0o123],
95-
'0O123' => ['0O123', 0O123],
96-
'-0o123' => ['-0o123', -0o123],
97-
'-0O123' => ['-0O123', -0O123],
98-
'0x1a' => ['0x1a', 0x1a],
99-
'0X1A' => ['0X1A', 0X1A],
100-
'-0x1a' => ['-0x1a', -0x1a],
101-
'-0X1A' => ['-0X1A', -0X1A],
102-
'0b11111111' => ['0b11111111', 0b11111111],
103-
'0B11111111' => ['0B11111111', 0B11111111],
104-
'-0b11111111' => ['-0b11111111', -0b11111111],
105-
'-0B11111111' => ['-0B11111111', -0B11111111],
88+
'1234' => ['1234', 1234],
89+
'-1234' => ['-1234', -1234],
90+
'1_234_567' => ['1_234_567', 1_234_567],
91+
'-1_234_567' => ['-1_234_567', -1_234_567],
92+
'0123' => ['0123', 0123],
93+
'-0123' => ['-0123', -0123],
94+
'0o123' => ['0o123', 0o123],
95+
'0O123' => ['0O123', 0O123],
96+
'-0o123' => ['-0o123', -0o123],
97+
'-0O123' => ['-0O123', -0O123],
98+
'0x1a' => ['0x1a', 0x1a],
99+
'0X1A' => ['0X1A', 0X1A],
100+
'-0x1a' => ['-0x1a', -0x1a],
101+
'-0X1A' => ['-0X1A', -0X1A],
102+
'0b11111111' => ['0b11111111', 0b11111111],
103+
'0B11111111' => ['0B11111111', 0B11111111],
104+
'-0b11111111' => ['-0b11111111', -0b11111111],
105+
'-0B11111111' => ['-0B11111111', -0B11111111],
106+
'0b1111_1111' => ['0b1111_1111', 0b11111111],
107+
'0B1111_1111' => ['0B1111_1111', 0B11111111],
108+
'-0b1111_1111' => ['-0b1111_1111', -0b11111111],
109+
'-0B1111_1111' => ['-0B1111_1111', -0B11111111],
110+
'0x42e2' => ['0x42e2', 17122],
111+
'0X42e2' => ['0X42e2', 17122],
112+
'0x42E2' => ['0X42E2', 17122],
113+
'0x4_2e2' => ['0x4_2e2', 17122],
114+
'-0x42e2' => ['-0x42e2', -17122],
115+
'-0X42e2' => ['-0X42e2', -17122],
116+
'-0x42E2' => ['-0X42E2', -17122],
117+
'-0x4_2e2' => ['-0x4_2e2', -17122],
106118
];
107119
}
108120

tests/Unit/Types/PhpStanTypesTest.php

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -363,11 +363,11 @@ public static function typesDataProvider(): iterable
363363
yield 'callable(int, int): string' => ['callable(int, int): string', <<<'AST'
364364
Stmt\CallableTypeNode
365365
Name(callable)
366-
Stmt\Callable\ArgumentsListNode
367-
Stmt\Callable\ArgumentNode(simple)
366+
Stmt\Callable\ParametersListNode
367+
Stmt\Callable\ParameterNode(simple)
368368
Stmt\NamedTypeNode
369369
Name(int)
370-
Stmt\Callable\ArgumentNode(simple)
370+
Stmt\Callable\ParameterNode(simple)
371371
Stmt\NamedTypeNode
372372
Name(int)
373373
Stmt\NamedTypeNode
@@ -376,11 +376,11 @@ public static function typesDataProvider(): iterable
376376
yield 'callable(int, int=): string' => ['callable(int, int=): string', <<<'AST'
377377
Stmt\CallableTypeNode
378378
Name(callable)
379-
Stmt\Callable\ArgumentsListNode
380-
Stmt\Callable\ArgumentNode(simple)
379+
Stmt\Callable\ParametersListNode
380+
Stmt\Callable\ParameterNode(simple)
381381
Stmt\NamedTypeNode
382382
Name(int)
383-
Stmt\Callable\ArgumentNode(optional)
383+
Stmt\Callable\ParameterNode(optional)
384384
Stmt\NamedTypeNode
385385
Name(int)
386386
Stmt\NamedTypeNode
@@ -389,12 +389,12 @@ public static function typesDataProvider(): iterable
389389
yield 'callable(int $foo, string $bar): void' => ['callable(int $foo, string $bar): void', <<<'AST'
390390
Stmt\CallableTypeNode
391391
Name(callable)
392-
Stmt\Callable\ArgumentsListNode
393-
Stmt\Callable\ArgumentNode(simple)
392+
Stmt\Callable\ParametersListNode
393+
Stmt\Callable\ParameterNode(simple)
394394
Stmt\NamedTypeNode
395395
Name(int)
396396
Literal\VariableLiteralNode($foo)
397-
Stmt\Callable\ArgumentNode(simple)
397+
Stmt\Callable\ParameterNode(simple)
398398
Stmt\NamedTypeNode
399399
Name(string)
400400
Literal\VariableLiteralNode($bar)
@@ -404,8 +404,8 @@ public static function typesDataProvider(): iterable
404404
yield 'callable(string &$bar): mixed' => ['callable(string &$bar): mixed', <<<'AST'
405405
Stmt\CallableTypeNode
406406
Name(callable)
407-
Stmt\Callable\ArgumentsListNode
408-
Stmt\Callable\ArgumentNode(output)
407+
Stmt\Callable\ParametersListNode
408+
Stmt\Callable\ParameterNode(output)
409409
Stmt\NamedTypeNode
410410
Name(string)
411411
Literal\VariableLiteralNode($bar)
@@ -415,8 +415,8 @@ public static function typesDataProvider(): iterable
415415
yield 'callable(float ...$floats): (int|null)' => ['callable(float ...$floats): (int|null)', <<<'AST'
416416
Stmt\CallableTypeNode
417417
Name(callable)
418-
Stmt\Callable\ArgumentsListNode
419-
Stmt\Callable\ArgumentNode(variadic)
418+
Stmt\Callable\ParametersListNode
419+
Stmt\Callable\ParameterNode(variadic)
420420
Stmt\NamedTypeNode
421421
Name(float)
422422
Literal\VariableLiteralNode($floats)
@@ -428,8 +428,8 @@ public static function typesDataProvider(): iterable
428428
yield 'callable(float...): (int|null)' => ['callable(float...): (int|null)', <<<'AST'
429429
Stmt\CallableTypeNode
430430
Name(callable)
431-
Stmt\Callable\ArgumentsListNode
432-
Stmt\Callable\ArgumentNode(variadic)
431+
Stmt\Callable\ParametersListNode
432+
Stmt\Callable\ParameterNode(variadic)
433433
Stmt\NamedTypeNode
434434
Name(float)
435435
Stmt\UnionTypeNode
@@ -440,11 +440,11 @@ public static function typesDataProvider(): iterable
440440
yield '\Closure(int, int): string' => ['\Closure(int, int): string', <<<'AST'
441441
Stmt\CallableTypeNode
442442
FullQualifiedName(\Closure)
443-
Stmt\Callable\ArgumentsListNode
444-
Stmt\Callable\ArgumentNode(simple)
443+
Stmt\Callable\ParametersListNode
444+
Stmt\Callable\ParameterNode(simple)
445445
Stmt\NamedTypeNode
446446
Name(int)
447-
Stmt\Callable\ArgumentNode(simple)
447+
Stmt\Callable\ParameterNode(simple)
448448
Stmt\NamedTypeNode
449449
Name(int)
450450
Stmt\NamedTypeNode

0 commit comments

Comments
 (0)