summaryrefslogtreecommitdiffstats
path: root/modules/gdscript/gdscript_tokenizer.cpp
diff options
context:
space:
mode:
authorDanil Alexeev <danil@alexeev.xyz>2023-02-13 09:46:31 +0300
committerDanil Alexeev <danil@alexeev.xyz>2023-06-14 21:47:12 +0300
commitfba8cbe6dbf17399e06ac9141a862734187dfb65 (patch)
tree7a48d44a48059c7b5d9bfa3e575b32637f3870cc /modules/gdscript/gdscript_tokenizer.cpp
parent33957aee69683cf1f542a8622e5a9efd23070f1c (diff)
downloadredot-engine-fba8cbe6dbf17399e06ac9141a862734187dfb65.tar.gz
GDScript: Fix repeated `_` are allowed after decimal point
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;