From 521444b96c563911b7c7b4c91d15dcfc36923b82 Mon Sep 17 00:00:00 2001 From: NeilKleistGao Date: Sat, 18 Jan 2025 17:17:44 +0800 Subject: [PATCH] Fix number parsing --- Src/Runtime/Interpreter.cs | 28 +++++++++++++++++++++----- Src/Utils/Extensions.cs | 5 +++-- Tests/Mario/literals.mario | 40 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/Src/Runtime/Interpreter.cs b/Src/Runtime/Interpreter.cs index a7561c5..308974c 100644 --- a/Src/Runtime/Interpreter.cs +++ b/Src/Runtime/Interpreter.cs @@ -31,13 +31,31 @@ private Literal AllocateLiteral(string text) { else if (text == "false") { // TODO: bool } + else if (text.Contains(".") || text.Contains("e") || text.Contains("E")) { + return new EvalNumberLit(Convert.ToDouble(text)); + } else { - int i; double d; - if (int.TryParse(text, out i)) { - return new EvalIntLit(i); + text = text.ToLower(); + int flag = 1; + if (text.StartsWith("-")) { + flag = -1; + text = text[1..]; + } + else if (text.StartsWith("+")) { + text = text[1..]; + } + + if (text.StartsWith("0x")) { + return new EvalIntLit(flag * Convert.ToInt32(text[2..], 16)); } - else if (double.TryParse(text, out d)) { - return new EvalNumberLit(d); + else if (text.StartsWith("0b")) { + return new EvalIntLit(flag * Convert.ToInt32(text[2..], 2)); + } + else if (text.StartsWith("0")) { + return new EvalIntLit(flag * Convert.ToInt32(text[1..], 8)); + } + else { + return new EvalIntLit(flag * Convert.ToInt32(text)); } } diff --git a/Src/Utils/Extensions.cs b/Src/Utils/Extensions.cs index 3888613..d59ab3b 100644 --- a/Src/Utils/Extensions.cs +++ b/Src/Utils/Extensions.cs @@ -40,8 +40,9 @@ public static bool IsDelimiter(this char value) { } public static bool IsDigitComponent(this char value) { - return char.IsDigit(value) || value == '.' || char.ToLower(value) == 'e' || value == '_' || - char.ToLower(value) == 'x' || char.ToLower(value) == 'b' || char.ToLower(value) == 'p'; + return char.IsDigit(value) || value == '.' || value == '+' || value == '-' || char.ToLower(value) == 'e' || + char.ToLower(value) == 'x' || char.ToLower(value) == 'b' || char.ToLower(value) == 'a' || char.ToLower(value) == 'b' || + char.ToLower(value) == 'c' || char.ToLower(value) == 'd' || char.ToLower(value) == 'f'; } } diff --git a/Tests/Mario/literals.mario b/Tests/Mario/literals.mario index e2078da..49ef18d 100644 --- a/Tests/Mario/literals.mario +++ b/Tests/Mario/literals.mario @@ -11,3 +11,43 @@ 1e5 ;;|| --- Result --- || ;;|| Res: 100000 + + +-12 +;;|| --- Result --- || +;;|| Res: -12 + + +1e-1 +;;|| --- Result --- || +;;|| Res: 0.1 + + +2E2 +;;|| --- Result --- || +;;|| Res: 200 + + +0x12AB +;;|| --- Result --- || +;;|| Res: 4779 + + +-0x55 +;;|| --- Result --- || +;;|| Res: -85 + + +0b000111 +;;|| --- Result --- || +;;|| Res: 7 + + +0123 +;;|| --- Result --- || +;;|| Res: 83 + + ++0xff +;;|| --- Result --- || +;;|| Res: 255