extend support for numeral literals (#4176)
This commit is contained in:
31
lib/parse.js
31
lib/parse.js
@@ -60,8 +60,9 @@ KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM);
|
||||
|
||||
var OPERATOR_CHARS = makePredicate(characters("+-*&%=<>!?|~^"));
|
||||
|
||||
var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;
|
||||
var RE_OCT_NUMBER = /^0[0-7]+$/;
|
||||
var RE_BIN_NUMBER = /^0b([01]+)$/i;
|
||||
var RE_HEX_NUMBER = /^0x([0-9a-f]+)$/i;
|
||||
var RE_OCT_NUMBER = /^0o?([0-7]+)$/i;
|
||||
|
||||
var OPERATORS = makePredicate([
|
||||
"in",
|
||||
@@ -147,10 +148,6 @@ function is_digit(code) {
|
||||
return code >= 48 && code <= 57;
|
||||
}
|
||||
|
||||
function is_alphanumeric_char(code) {
|
||||
return is_digit(code) || is_letter(code);
|
||||
}
|
||||
|
||||
function is_unicode_digit(code) {
|
||||
return UNICODE.digit.test(String.fromCharCode(code));
|
||||
}
|
||||
@@ -184,14 +181,12 @@ function is_identifier_string(str) {
|
||||
}
|
||||
|
||||
function parse_js_number(num) {
|
||||
if (RE_HEX_NUMBER.test(num)) {
|
||||
return parseInt(num.substr(2), 16);
|
||||
} else if (RE_OCT_NUMBER.test(num)) {
|
||||
return parseInt(num.substr(1), 8);
|
||||
} else {
|
||||
var val = parseFloat(num);
|
||||
if (val == num) return val;
|
||||
}
|
||||
var match;
|
||||
if (match = RE_BIN_NUMBER.exec(num)) return parseInt(match[1], 2);
|
||||
if (match = RE_HEX_NUMBER.exec(num)) return parseInt(match[1], 16);
|
||||
if (match = RE_OCT_NUMBER.exec(num)) return parseInt(match[1], 8);
|
||||
var val = parseFloat(num);
|
||||
if (val == num) return val;
|
||||
}
|
||||
|
||||
function JS_Parse_Error(message, filename, line, col, pos) {
|
||||
@@ -347,11 +342,13 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
||||
case (after_e = false, 46): // .
|
||||
return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;
|
||||
}
|
||||
return is_alphanumeric_char(code);
|
||||
return is_digit(code) || is_letter(code) || ch == "_";
|
||||
});
|
||||
if (prefix) num = prefix + num;
|
||||
if (RE_OCT_NUMBER.test(num) && next_token.has_directive("use strict")) {
|
||||
parse_error("Legacy octal literals are not allowed in strict mode");
|
||||
if (/^0[0-7_]+$/.test(num)) {
|
||||
if (next_token.has_directive("use strict")) parse_error("Legacy octal literals are not allowed in strict mode");
|
||||
} else {
|
||||
num = num.replace(has_x ? /([1-9a-f]|.0)_(?=[0-9a-f])/gi : /([1-9]|.0)_(?=[0-9])/gi, "$1");
|
||||
}
|
||||
var valid = parse_js_number(num);
|
||||
if (!isNaN(valid)) return token("num", valid);
|
||||
|
||||
Reference in New Issue
Block a user