From 3ced090ab4691ceab5450646553f61b7bfe29713 Mon Sep 17 00:00:00 2001 From: Taco de Wolff Date: Thu, 11 Jan 2024 10:40:14 -0300 Subject: [PATCH] JS: support parsing binary/octal/hexadecimal integers with big int suffix, fixes #116 --- js/lex.go | 9 +++++++++ js/lex_test.go | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/js/lex.go b/js/lex.go index ac00e85..9ed9fa3 100644 --- a/js/lex.go +++ b/js/lex.go @@ -538,6 +538,9 @@ func (l *Lexer) consumeNumericToken() TokenType { if l.consumeHexDigit() { for l.consumeHexDigit() || l.consumeNumericSeparator(l.consumeHexDigit) { } + if l.r.Peek(0) == 'n' { + l.r.Move(1) + } return HexadecimalToken } l.err = parse.NewErrorLexer(l.r, "invalid hexadecimal number") @@ -547,6 +550,9 @@ func (l *Lexer) consumeNumericToken() TokenType { if l.consumeBinaryDigit() { for l.consumeBinaryDigit() || l.consumeNumericSeparator(l.consumeBinaryDigit) { } + if l.r.Peek(0) == 'n' { + l.r.Move(1) + } return BinaryToken } l.err = parse.NewErrorLexer(l.r, "invalid binary number") @@ -556,6 +562,9 @@ func (l *Lexer) consumeNumericToken() TokenType { if l.consumeOctalDigit() { for l.consumeOctalDigit() || l.consumeNumericSeparator(l.consumeOctalDigit) { } + if l.r.Peek(0) == 'n' { + l.r.Move(1) + } return OctalToken } l.err = parse.NewErrorLexer(l.r, "invalid octal number") diff --git a/js/lex_test.go b/js/lex_test.go index 9acd1f1..938a3ef 100644 --- a/js/lex_test.go +++ b/js/lex_test.go @@ -21,7 +21,7 @@ func TestTokens(t *testing.T) { {"5.2 .04 1. 2.e3 0x0F 5e99", TTs{DecimalToken, DecimalToken, DecimalToken, DecimalToken, HexadecimalToken, DecimalToken}}, {"2_3 5_4.1_2 1_1n 0o2_3 0b1_1 0xF_F", TTs{DecimalToken, DecimalToken, BigIntToken, OctalToken, BinaryToken, HexadecimalToken}}, {"0o22 0b11", TTs{OctalToken, BinaryToken}}, - {"0n 2345n 435.333n", TTs{BigIntToken, BigIntToken, DecimalToken, ErrorToken}}, + {"0n 2345n 0o5n 0b1n 0x5n 435.333n", TTs{IntegerToken, IntegerToken, OctalToken, BinaryToken, HexadecimalToken, DecimalToken, ErrorToken}}, {"a = 'string'", TTs{IdentifierToken, EqToken, StringToken}}, {"/*comment*/ //comment", TTs{CommentToken, CommentToken}}, {"{ } ( ) [ ]", TTs{OpenBraceToken, CloseBraceToken, OpenParenToken, CloseParenToken, OpenBracketToken, CloseBracketToken}},