fix(lexers): recognize TypeScript binary, octal and exponent literals

the typescript lexer only had three number rules, so literals like 0b1010, 0o17, 0XFF, 1e5 and 1_000 were split into a number and a name. this ports the javascript number rules, with the float rule also keeping a fraction and an exponent together (1.5e10) as before, and adds a testdata/typescript/number_literals fixture.
This commit is contained in:
dualfroz committed 2026-10-07 20:10:35 +02:00
1 parent e6499d1d6d
commit dc8e36e79b
3 files changed
+90 -3

No files matched your search

+9 -3
View File
@@ -275,13 +275,19 @@
<rule pattern="[$a-zA-Z_]\w*"> <rule pattern="[$a-zA-Z_]\w*">
<token type="NameOther" /> <token type="NameOther" />
</rule> </rule>
<rule pattern="[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?"> <rule pattern="\d+(\.\d*([eE][+\-]?\d+)?|[eE][+\-]?\d+)">
<token type="LiteralNumberFloat" /> <token type="LiteralNumberFloat" />
</rule> </rule>
<rule pattern="0x[0-9a-fA-F]+"> <rule pattern="0[bB][01]+">
<token type="LiteralNumberBin" />
</rule>
<rule pattern="0[oO][0-7]+">
<token type="LiteralNumberOct" />
</rule>
<rule pattern="0[xX][0-9a-fA-F]+">
<token type="LiteralNumberHex" /> <token type="LiteralNumberHex" />
</rule> </rule>
<rule pattern="[0-9]+"> <rule pattern="[0-9][0-9_]*">
<token type="LiteralNumberInteger" /> <token type="LiteralNumberInteger" />
</rule> </rule>
<rule pattern="&#34;(\\\\|\\&#34;|[^&#34;])*&#34;"> <rule pattern="&#34;(\\\\|\\&#34;|[^&#34;])*&#34;">
+19
View File
@@ -0,0 +1,19 @@
const mode = 0o644;
0O755
0b1010
0B1010
0xff
0XFF
1e5
1E5
1e+5
1e-5
1.5
1.
1.5e10
2.5E-3
1_000
1_000_000
42
0
const total = 0XFF + 1e-5 * 1_000;
+62
View File
@@ -0,0 +1,62 @@
[
{"type":"KeywordReserved","value":"const"},
{"type":"Text","value":" "},
{"type":"NameOther","value":"mode"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralNumberOct","value":"0o644"},
{"type":"Punctuation","value":";"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberOct","value":"0O755"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberBin","value":"0b1010"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberBin","value":"0B1010"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberHex","value":"0xff"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberHex","value":"0XFF"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1e5"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1E5"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1e+5"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1e-5"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1.5"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1."},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"1.5e10"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberFloat","value":"2.5E-3"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberInteger","value":"1_000"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberInteger","value":"1_000_000"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberInteger","value":"42"},
{"type":"Text","value":"\n"},
{"type":"LiteralNumberInteger","value":"0"},
{"type":"Text","value":"\n"},
{"type":"KeywordReserved","value":"const"},
{"type":"Text","value":" "},
{"type":"NameOther","value":"total"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralNumberHex","value":"0XFF"},
{"type":"Text","value":" "},
{"type":"Operator","value":"+"},
{"type":"Text","value":" "},
{"type":"LiteralNumberFloat","value":"1e-5"},
{"type":"Text","value":" "},
{"type":"Operator","value":"*"},
{"type":"Text","value":" "},
{"type":"LiteralNumberInteger","value":"1_000"},
{"type":"Punctuation","value":";"},
{"type":"Text","value":"\n"}
]