GDScript: Fix repeated _ are allowed after decimal point

This commit is contained in:
Danil Alexeev 2023-02-13 09:46:31 +03:00
parent 33957aee69
commit fba8cbe6db
No known key found for this signature in database
GPG key ID: 124453E157DA8DC7
7 changed files with 88 additions and 15 deletions

View file

@ -659,12 +659,20 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
}
}
// Allow '_' to be used in a number, for readability.
bool previous_was_underscore = false;
if (base != 10 && is_underscore(_peek())) { // Disallow `0x_` and `0b_`.
Token error = make_error(vformat(R"(Unexpected underscore after "0%c".)", _peek(-1)));
error.start_column = column;
error.leftmost_column = column;
error.end_column = column + 1;
error.rightmost_column = column + 1;
push_error(error);
has_error = true;
}
bool previous_was_underscore = false; // Allow `_` to be used in a number, for readability.
while (digit_check_func(_peek()) || is_underscore(_peek())) {
if (is_underscore(_peek())) {
if (previous_was_underscore) {
Token error = make_error(R"(Only one underscore can be used as a numeric separator.)");
Token error = make_error(R"(Multiple underscores cannot be adjacent in a numeric literal.)");
error.start_column = column;
error.leftmost_column = column;
error.end_column = column + 1;
@ -711,7 +719,30 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
_advance();
// Consume decimal digits.
if (is_underscore(_peek())) { // Disallow `10._`, but allow `10.`.
Token error = make_error(R"(Unexpected underscore after decimal point.)");
error.start_column = column;
error.leftmost_column = column;
error.end_column = column + 1;
error.rightmost_column = column + 1;
push_error(error);
has_error = true;
}
previous_was_underscore = false;
while (is_digit(_peek()) || is_underscore(_peek())) {
if (is_underscore(_peek())) {
if (previous_was_underscore) {
Token error = make_error(R"(Multiple underscores cannot be adjacent in a numeric literal.)");
error.start_column = column;
error.leftmost_column = column;
error.end_column = column + 1;
error.rightmost_column = column + 1;
push_error(error);
}
previous_was_underscore = true;
} else {
previous_was_underscore = false;
}
_advance();
}
}
@ -737,7 +768,7 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
while (is_digit(_peek()) || is_underscore(_peek())) {
if (is_underscore(_peek())) {
if (previous_was_underscore) {
Token error = make_error(R"(Only one underscore can be used as a numeric separator.)");
Token error = make_error(R"(Multiple underscores cannot be adjacent in a numeric literal.)");
error.start_column = column;
error.leftmost_column = column;
error.end_column = column + 1;

View file

@ -1,3 +1,3 @@
func test():
# Number separators may not be placed right next to each other.
var __ = 1__23
var _num = 1__23

View file

@ -1,2 +1,2 @@
GDTEST_PARSER_ERROR
Only one underscore can be used as a numeric separator.
Multiple underscores cannot be adjacent in a numeric literal.

View file

@ -0,0 +1,3 @@
func test():
# Number separators may not be placed right next to each other.
var _num = 123.45__67

View file

@ -0,0 +1,2 @@
GDTEST_PARSER_ERROR
Multiple underscores cannot be adjacent in a numeric literal.

View file

@ -1,12 +1,26 @@
func test():
# `_` can be used as a separator for numbers in GDScript.
# It can be placed anywhere in the number, except at the beginning.
# Currently, GDScript in the `master` branch only allows using one separator
# per number.
# Results are assigned to variables to avoid warnings.
var __ = 1_23
__ = 123_ # Trailing number separators are OK.
__ = 12_3
__ = 123_456
__ = 0x1234_5678
__ = 0b1001_0101
print(1_23)
print(12_3)
print(1_2_3)
print(123_) # Trailing number separators are OK.
print(123_456)
print(123_45_6_)
print("---")
print(0x1234_00ff)
print(0x1234_00_f_f_)
print(0b1001_0101)
print(0b1001_01_0_1_)
print("---")
print(-1_234.456_7)
print(-1_23_4_.4_56_7_)
print(-1_234.)
print(-1_23_4_.)
print(.456_7)
print(.4_56_7_)
print("---")
print(-1_234.5e000_3)
print(-1_23_4_.5e0_00_3_)
print(-1_234.5e+000_3)
print(-1_23_4_.5e+0_00_3_)

View file

@ -1 +1,24 @@
GDTEST_OK
123
123
123
123
123456
123456
---
305398015
305398015
149
149
---
-1234.4567
-1234.4567
-1234
-1234
0.4567
0.4567
---
-1234500
-1234500
-1234500
-1234500