- 实现了 match 表达式的解析和编译功能 - 添加了多个测试用例验证 match 表达式的基本功能 - 包括基本匹配、默认情况、多条件匹配等功能测试 - 实现了 match 表达式的错误处理机制 - 添加了对重复条件和尾随逗号的支持测试 - 更新了 AST 节点类型检查以支持 Match_ 表达式 - 在常量列表中添加 bool 类型支持pull/1/head
parent
46e15ca247
commit
a72752828f
11 changed files with 294 additions and 1 deletions
@ -0,0 +1,37 @@ |
|||||||
|
--TEST-- |
||||||
|
Basic match expression functionality test |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function wordify($x) { |
||||||
|
return match ($x) { |
||||||
|
0 => 'Zero', |
||||||
|
1 => 'One', |
||||||
|
2 => 'Two', |
||||||
|
3 => 'Three', |
||||||
|
4 => 'Four', |
||||||
|
5 => 'Five', |
||||||
|
6 => 'Six', |
||||||
|
7 => 'Seven', |
||||||
|
8 => 'Eight', |
||||||
|
9 => 'Nine', |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
for ($i = 0; $i <= 9; $i++) { |
||||||
|
print wordify($i) . "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
Zero |
||||||
|
One |
||||||
|
Two |
||||||
|
Three |
||||||
|
Four |
||||||
|
Five |
||||||
|
Six |
||||||
|
Seven |
||||||
|
Eight |
||||||
|
Nine |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
--TEST-- |
||||||
|
Match expression omit trailing comma |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function print_bool($bool) { |
||||||
|
echo match ($bool) { |
||||||
|
true => "true\n", |
||||||
|
false => "false\n" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
print_bool(true); |
||||||
|
print_bool(false); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
true |
||||||
|
false |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
--TEST-- |
||||||
|
Match expression default case |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function get_value($i) { |
||||||
|
return match ($i) { |
||||||
|
1 => 1, |
||||||
|
2 => 2, |
||||||
|
default => 'default', |
||||||
|
}; |
||||||
|
} |
||||||
|
function main() { |
||||||
|
echo get_value(0) . "\n"; |
||||||
|
echo get_value(1) . "\n"; |
||||||
|
echo get_value(2) . "\n"; |
||||||
|
echo get_value(3) . "\n"; |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
default |
||||||
|
1 |
||||||
|
2 |
||||||
|
default |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
--TEST-- |
||||||
|
Match expression with true as expression |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function get_range($i) { |
||||||
|
return match (true) { |
||||||
|
$i >= 50 => '50+', |
||||||
|
$i >= 40 => '40-50', |
||||||
|
$i >= 30 => '30-40', |
||||||
|
$i >= 20 => '20-30', |
||||||
|
$i >= 10 => '10-20', |
||||||
|
default => '0-10', |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
echo get_range(22) . "\n"; |
||||||
|
echo get_range(0) . "\n"; |
||||||
|
echo get_range(59) . "\n"; |
||||||
|
echo get_range(13) . "\n"; |
||||||
|
echo get_range(39) . "\n"; |
||||||
|
echo get_range(40) . "\n"; |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
20-30 |
||||||
|
0-10 |
||||||
|
50+ |
||||||
|
10-20 |
||||||
|
30-40 |
||||||
|
40-50 |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
--TEST-- |
||||||
|
Match expression multiple conditions per case |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function is_working_day($day) { |
||||||
|
return match ($day) { |
||||||
|
1, 7 => false, |
||||||
|
2, 3, 4, 5, 6 => true, |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
for ($i = 1; $i <= 7; $i++) { |
||||||
|
var_dump(is_working_day($i)); |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
bool(false) |
||||||
|
bool(true) |
||||||
|
bool(true) |
||||||
|
bool(true) |
||||||
|
bool(true) |
||||||
|
bool(true) |
||||||
|
bool(false) |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
--TEST-- |
||||||
|
Implicit break in match expression |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function dump_and_return($string) { |
||||||
|
var_dump($string); |
||||||
|
return $string; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
var_dump(match ('foo') { |
||||||
|
'foo' => dump_and_return('foo'), |
||||||
|
'bar' => dump_and_return('bar'), |
||||||
|
}); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
string(3) "foo" |
||||||
|
string(3) "foo" |
||||||
@ -0,0 +1,61 @@ |
|||||||
|
--TEST-- |
||||||
|
Test match with duplicate conditions |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
$value = 1; |
||||||
|
|
||||||
|
echo match ($value) { |
||||||
|
1 => 1, |
||||||
|
2 => 2, |
||||||
|
3 => 3, |
||||||
|
4 => 4, |
||||||
|
5 => 5, |
||||||
|
1 => 6, |
||||||
|
}; |
||||||
|
echo "\n"; |
||||||
|
|
||||||
|
echo match ($value) { |
||||||
|
2, 1 => '2, 1', |
||||||
|
1 => 1, |
||||||
|
3 => 3, |
||||||
|
4 => 4, |
||||||
|
5 => 5, |
||||||
|
}; |
||||||
|
echo "\n"; |
||||||
|
|
||||||
|
echo match ($value) { |
||||||
|
1, 1 => '1, 1', |
||||||
|
2, 2 => '2, 2', |
||||||
|
3, 3 => '3, 3', |
||||||
|
4, 4 => '4, 4', |
||||||
|
5, 5 => '5, 5', |
||||||
|
}; |
||||||
|
echo "\n"; |
||||||
|
|
||||||
|
echo match ($value) { |
||||||
|
1 => 1, |
||||||
|
1 => 2, |
||||||
|
}; |
||||||
|
echo "\n"; |
||||||
|
|
||||||
|
echo match ($value) { |
||||||
|
2, 1 => '2, 1', |
||||||
|
1 => 1, |
||||||
|
}; |
||||||
|
echo "\n"; |
||||||
|
|
||||||
|
echo match ($value) { |
||||||
|
1, 1 => '1, 1', |
||||||
|
1 => 1, |
||||||
|
}; |
||||||
|
echo "\n"; |
||||||
|
|
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
1 |
||||||
|
2, 1 |
||||||
|
1, 1 |
||||||
|
1 |
||||||
|
2, 1 |
||||||
|
1, 1 |
||||||
@ -0,0 +1,34 @@ |
|||||||
|
--TEST-- |
||||||
|
Match expression with trailing comma in condition list |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function print_bool($bool) { |
||||||
|
echo match ($bool) { |
||||||
|
false, |
||||||
|
0, |
||||||
|
=> "false\n", |
||||||
|
true, |
||||||
|
1, |
||||||
|
=> "true\n", |
||||||
|
default, |
||||||
|
=> "not bool\n", |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
print_bool(false); |
||||||
|
print_bool(0); |
||||||
|
print_bool(true); |
||||||
|
print_bool(1); |
||||||
|
print_bool(2); |
||||||
|
print_bool('foo'); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
false |
||||||
|
false |
||||||
|
true |
||||||
|
true |
||||||
|
not bool |
||||||
|
not bool |
||||||
Loading…
Reference in new issue