Skip to content

Commit daa9b18

Browse files
authored
Merge pull request #212 from aspeddro/fix-number
Number: hex literal and decimal
2 parents 246547a + 933675d commit daa9b18

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

grammar.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,9 +1369,10 @@ module.exports = grammar({
13691369
extension_identifier: $ => /[a-zA-Z0-9_\.]+/,
13701370

13711371
number: $ => {
1372+
// OCaml: https://github.com/tree-sitter/tree-sitter-ocaml/blob/f1106bf834703f1f2f795da1a3b5f8f40174ffcc/ocaml/grammar.js#L26
13721373
const hex_literal = seq(
1373-
choice('0x', '0X'),
1374-
/[\da-fA-F](_?[\da-fA-F])*/
1374+
optional(choice('-', '+')),
1375+
/0[xX][0-9A-Fa-f][0-9A-Fa-f_]*(\.[0-9A-Fa-f_]*)?([pP][+\-]?[0-9][0-9_]*)?[g-zG-Z]?/
13751376
)
13761377

13771378
const decimal_digits = /\d(_?\d)*/
@@ -1385,8 +1386,8 @@ module.exports = grammar({
13851386
const bigint_literal = seq(choice(hex_literal, binary_literal, octal_literal, decimal_digits), 'n')
13861387

13871388
const decimal_integer_literal = choice(
1388-
'0',
1389-
seq(optional('0'), /[1-9]/, optional(seq(optional('_'), decimal_digits)))
1389+
repeat('0'),
1390+
seq(repeat('0'), /[1-9]/, optional(seq(optional('_'), decimal_digits)))
13901391
)
13911392

13921393
const decimal_literal = seq(

test/corpus/literals.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,24 @@ Numbers
4242
0o1234L
4343
10l
4444
0xffffffffl
45+
-0x3.p+1
46+
0x1p2047
47+
-0x1p2047
48+
0x1.2p2047
49+
0x1p-1022
50+
0x0.0000_0000_0000_1p-1022
51+
0x1p-52
52+
0x1.0000_0000_0000_1
53+
0x1p-1023
54+
0xffffp0
55+
00007.0
56+
02e3
57+
0000.2
58+
00.
59+
000.
60+
01.
61+
001.
62+
002e3
4563

4664
---
4765

@@ -72,6 +90,24 @@ Numbers
7290
(expression_statement (number))
7391
(expression_statement (number))
7492
(expression_statement (number))
93+
(expression_statement (number))
94+
(expression_statement (number))
95+
(expression_statement (number))
96+
(expression_statement (number))
97+
(expression_statement (number))
98+
(expression_statement (number))
99+
(expression_statement (number))
100+
(expression_statement (number))
101+
(expression_statement (number))
102+
(expression_statement (number))
103+
(expression_statement (number))
104+
(expression_statement (number))
105+
(expression_statement (number))
106+
(expression_statement (number))
107+
(expression_statement (number))
108+
(expression_statement (number))
109+
(expression_statement (number))
110+
(expression_statement (number))
75111
(expression_statement (number)))
76112

77113
==========================================

0 commit comments

Comments
 (0)