diff --git a/es2panda/lexer/lexer.cpp b/es2panda/lexer/lexer.cpp index 8b2210e8dc7522cc6477f1a503454097c99fc0ea..6ba93184a8ab0b29a85f653806371e3f17bf61f4 100644 --- a/es2panda/lexer/lexer.cpp +++ b/es2panda/lexer/lexer.cpp @@ -304,6 +304,7 @@ void Lexer::ScanDecimalNumbers(bool allowNumericSeparator) } case LEX_CHAR_UNDERSCORE: { Iterator().Backward(1); + isUnderscore_ = true; if (Iterator().Peek() == LEX_CHAR_DOT || !allowNumericSeparator || !allowNumericOnNext) { Iterator().Forward(1); @@ -421,6 +422,10 @@ void Lexer::ScanNumber(bool allowNumericSeparator, bool allowBigInt) if (!allowBigInt) { ThrowError("Invalid BigInt number"); } + if (isUnderscore_) { + ConvertNumber(exponentSignPos); + isUnderscore_ = false; + } return; } diff --git a/es2panda/lexer/lexer.h b/es2panda/lexer/lexer.h index b8302270254e34d7535b8cc14df7819cea242c25..8e56da6ed23d1c25d7e6a9a3cce75474f5087611 100644 --- a/es2panda/lexer/lexer.h +++ b/es2panda/lexer/lexer.h @@ -174,6 +174,7 @@ private: const parser::ParserContext *parserContext_; util::StringView source_; LexerPosition pos_; + bool isUnderscore_ = false; }; class TemplateLiteralParserContext { diff --git a/test262/es2021_tests.txt b/test262/es2021_tests.txt index 2c8dfed8b24149b2c67eac579487b02f07f0d9c4..621ccf078c9525179e0288eaf10d6282cf34cd10 100644 --- a/test262/es2021_tests.txt +++ b/test262/es2021_tests.txt @@ -1121,6 +1121,24 @@ annexB/built-ins/RegExp/incomplete_hex_unicode_escape.js annexB/built-ins/RegExp/named-groups/non-unicode-malformed-lookbehind.js annexB/built-ins/RegExp/named-groups/non-unicode-malformed.js language/literals/bigint/numeric-separators/numeric-separator-literal-unicode-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-bil-bd-nsl-bd-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-dds-nsl-dds-dunder-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-dd-nsl-dds-dunder-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-dds-nsl-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-bil-nsl-bd-dunder-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-hil-nsl-hd-dunder-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-bil-nsl-bd-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-hil-hd-nsl-hd-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-oil-nsl-od-dunder-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-lol-00-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-hil-nsl-hd-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-unicode-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-dd-nsl-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-lol-01-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-lol-07-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-nzd-nsl-dds-dunder-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-oil-nsl-od-err.js +language/literals/bigint/numeric-separators/numeric-separator-literal-oil-od-nsl-od-err.js language/literals/string/unicode-escape-nls-err-single.js language/literals/string/unicode-escape-no-hex-err-single.js language/literals/string/unicode-escape-nls-err-double.js