summaryrefslogtreecommitdiffstats
path: root/modules/gdscript/gdscript_tokenizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript/gdscript_tokenizer.cpp')
-rw-r--r--modules/gdscript/gdscript_tokenizer.cpp39
1 files changed, 35 insertions, 4 deletions
diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp
index a45a73a8d5..ce0f53fcfb 100644
--- a/modules/gdscript/gdscript_tokenizer.cpp
+++ b/modules/gdscript/gdscript_tokenizer.cpp
@@ -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;