From 363e7118d6192cd33c1b4ee4888d13acf2e435ee Mon Sep 17 00:00:00 2001 From: metoule Date: Wed, 22 Jun 2022 15:44:10 +0200 Subject: [PATCH] Fix issue when parsing hexadecimal and binary literals. Fix #241 --- src/DynamicExpresso.Core/Parsing/Parser.cs | 7 +++++++ test/DynamicExpresso.UnitTest/LiteralsTest.cs | 7 +++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/DynamicExpresso.Core/Parsing/Parser.cs b/src/DynamicExpresso.Core/Parsing/Parser.cs index fa3a1c3..16f6698 100644 --- a/src/DynamicExpresso.Core/Parsing/Parser.cs +++ b/src/DynamicExpresso.Core/Parsing/Parser.cs @@ -893,6 +893,9 @@ private Expression ParseIntegerLiteral() else if (text.StartsWith("0b") || text.StartsWith("0B")) { var binary = text.Substring(2); + if (string.IsNullOrEmpty(binary)) + throw CreateParseException(_token.pos, ErrorMessages.InvalidIntegerLiteral, text); + try { value = Convert.ToUInt64(binary, 2); @@ -3073,6 +3076,8 @@ private void NextToken() { NextChar(); } while (char.IsDigit(_parseChar) || (_parseChar >= 'a' && _parseChar <= 'f') || (_parseChar >= 'A' && _parseChar <= 'F')); + + PreviousChar(); } else if (_parseChar == 'b' || _parseChar == 'B') { @@ -3081,6 +3086,8 @@ private void NextToken() { NextChar(); } while (_parseChar == '0' || _parseChar == '1'); + + PreviousChar(); } else { diff --git a/test/DynamicExpresso.UnitTest/LiteralsTest.cs b/test/DynamicExpresso.UnitTest/LiteralsTest.cs index 28817a2..6dcf77d 100644 --- a/test/DynamicExpresso.UnitTest/LiteralsTest.cs +++ b/test/DynamicExpresso.UnitTest/LiteralsTest.cs @@ -360,8 +360,9 @@ public void Binary_Literals() Assert.AreEqual(0b101ul, target.Eval("0b101ul")); Assert.AreEqual(0B1111L, target.Eval("0B1111l")); - Assert.AreEqual(6, target.Eval("4 + 0b10")); + Assert.AreEqual(8, target.Eval("4+0b10+2")); + Assert.Throws(() => target.Eval("0b")); Assert.Throws(() => target.Eval("0b12")); Assert.Throws(() => target.Eval("0b10.10")); Assert.Throws(() => target.Eval("0b10d")); @@ -375,8 +376,10 @@ public void Hexadecimal_Literals() Assert.AreEqual(0x012EFul, target.Eval("0x012EFul")); Assert.AreEqual(0XAAe2L, target.Eval("0XAAe2l")); - Assert.AreEqual(165, target.Eval("4 + 0xA1")); + Assert.AreEqual(170, target.Eval("4+0xA1+5")); + Assert.AreEqual(170, target.Eval("4+(0xA1)+5")); + Assert.Throws(() => target.Eval("0x")); Assert.Throws(() => target.Eval("0x1Gl")); Assert.Throws(() => target.Eval("0x12.12")); }