Copy over number definition from tree-sitter-javascript and allow signed numbers
@@ -34,16 +34,41 @@ module.exports = grammar({
string: $ => token(seq('"', repeat(choice(/[^\\"\n]/, /\\./)), '"')),
- number: $ => token(choice(
- seq(
- "0x",
+ number: $ => {
+ const hex_literal = seq(
+ choice('0x', '0X'),
/[\da-fA-F]+/
- ),
- seq(
- /-?\d+/,
- optional(seq(".", /\d*/))
)
- )),
+
+ const decimal_digits = /\d+/
+ const signed_integer = seq(optional(choice('-','+')), decimal_digits)
+ const exponent_part = seq(choice('e', 'E'), signed_integer)
+
+ const binary_literal = seq(choice('0b', '0B'), /[0-1]+/)
+
+ const octal_literal = seq(choice('0o', '0O'), /[0-7]+/)
+
+ const decimal_integer_literal = seq(
+ optional(choice('-','+')),
+ choice(
+ '0',
+ seq(/[1-9]/, optional(decimal_digits))
+ )
+ )
+
+ const decimal_literal = choice(
+ seq(decimal_integer_literal, '.', optional(decimal_digits), optional(exponent_part)),
+ seq('.', decimal_digits, optional(exponent_part)),
+ seq(decimal_integer_literal, optional(exponent_part))
+ )
+
+ return token(choice(
+ hex_literal,
+ decimal_literal,
+ binary_literal,
+ octal_literal
+ ))
+ },
true: $ => "true",
