From 933675d5e43710be8208f76fb64a807d06e98c8a Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Sat, 15 Apr 2023 23:28:38 -0300 Subject: [PATCH] number: hex literal and decimal --- grammar.js | 9 +++++---- test/corpus/literals.txt | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/grammar.js b/grammar.js index c1ed37e..495dc18 100644 --- a/grammar.js +++ b/grammar.js @@ -1371,9 +1371,10 @@ module.exports = grammar({ extension_identifier: $ => /[a-zA-Z0-9_\.]+/, number: $ => { + // OCaml: https://github.com/tree-sitter/tree-sitter-ocaml/blob/f1106bf834703f1f2f795da1a3b5f8f40174ffcc/ocaml/grammar.js#L26 const hex_literal = seq( - choice('0x', '0X'), - /[\da-fA-F](_?[\da-fA-F])*/ + optional(choice('-', '+')), + /0[xX][0-9A-Fa-f][0-9A-Fa-f_]*(\.[0-9A-Fa-f_]*)?([pP][+\-]?[0-9][0-9_]*)?[g-zG-Z]?/ ) const decimal_digits = /\d(_?\d)*/ @@ -1387,8 +1388,8 @@ module.exports = grammar({ const bigint_literal = seq(choice(hex_literal, binary_literal, octal_literal, decimal_digits), 'n') const decimal_integer_literal = choice( - '0', - seq(optional('0'), /[1-9]/, optional(seq(optional('_'), decimal_digits))) + repeat('0'), + seq(repeat('0'), /[1-9]/, optional(seq(optional('_'), decimal_digits))) ) const decimal_literal = seq( diff --git a/test/corpus/literals.txt b/test/corpus/literals.txt index 14f4e2c..a6baf06 100644 --- a/test/corpus/literals.txt +++ b/test/corpus/literals.txt @@ -42,6 +42,24 @@ Numbers 0o1234L 10l 0xffffffffl +-0x3.p+1 +0x1p2047 +-0x1p2047 +0x1.2p2047 +0x1p-1022 +0x0.0000_0000_0000_1p-1022 +0x1p-52 +0x1.0000_0000_0000_1 +0x1p-1023 +0xffffp0 +00007.0 +02e3 +0000.2 +00. +000. +01. +001. +002e3 --- @@ -72,6 +90,24 @@ Numbers (expression_statement (number)) (expression_statement (number)) (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) + (expression_statement (number)) (expression_statement (number))) ==========================================