Selaa lähdekoodia

Merge pull request #178 from bplu4t2f/json-negative-number-fix

Fixed json parser not being able to handle negative numbers.
Kevin Morgan 6 vuotta sitten
vanhempi
sitoutus
564bc372da

+ 9 - 3
src/MoonSharp.Interpreter.Tests/EndToEnd/JsonSerializationTests.cs

@@ -58,6 +58,9 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 
 			Assert.AreEqual(DataType.String, s.Get("aString").Type);
 			Assert.AreEqual("8", s.Get("aString").String);
+
+			Assert.AreEqual(DataType.Number, t.Get("aNegativeNumber").Type);
+			Assert.AreEqual(-9, t.Get("aNegativeNumber").Number);
 		}
 
 
@@ -68,7 +71,8 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 				'aNumber' : 1,
 				'aString' : '2',
 				'anObject' : { 'aNumber' : 3, 'aString' : '4' },
-				'anArray' : [ 5, '6', true, null, { 'aNumber' : 7, 'aString' : '8' } ]
+				'anArray' : [ 5, '6', true, null, { 'aNumber' : 7, 'aString' : '8' } ],
+				'aNegativeNumber' : -9
 				}
 			".Replace('\'', '\"');
 
@@ -83,7 +87,8 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 				'aNumber' : 1,
 				'aString' : '2',
 				'anObject' : { 'aNumber' : 3, 'aString' : '4' },
-				'anArray' : [ 5, '6', true, null, { 'aNumber' : 7, 'aString' : '8' } ]
+				'anArray' : [ 5, '6', true, null, { 'aNumber' : 7, 'aString' : '8' } ],
+				'aNegativeNumber' : -9
 				}
 			".Replace('\'', '\"');
 
@@ -120,7 +125,8 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 						aNumber = 7,
 						aString = "8"
 					}
-				}
+				},
+				aNegativeNumber = -9
 			};
 
 

+ 27 - 2
src/MoonSharp.Interpreter/Serialization/Json/JsonTableConverter.cs

@@ -214,9 +214,9 @@ namespace MoonSharp.Interpreter.Serialization.Json
 			{
 				return DynValue.NewString(L.Current.Text);
 			}
-			else if (L.Current.Type == TokenType.Number)
+			else if (L.Current.Type == TokenType.Number || L.Current.Type == TokenType.Op_MinusOrSub)
 			{
-				return DynValue.NewNumber(L.Current.GetNumberValue()).AsReadOnly();
+				return ParseJsonNumberValue(L, script);
 			}
 			else if (L.Current.Type == TokenType.True)
 			{
@@ -235,5 +235,30 @@ namespace MoonSharp.Interpreter.Serialization.Json
 				throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text);
 			}
 		}
+
+		private static DynValue ParseJsonNumberValue(Lexer L, Script script)
+		{
+			bool negative;
+			if (L.Current.Type == TokenType.Op_MinusOrSub)
+			{
+				// Negative number consists of 2 tokens.
+				L.Next();
+				negative = true;
+			}
+			else
+			{
+				negative = false;
+			}
+			if (L.Current.Type != TokenType.Number)
+			{
+				throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text);
+			}
+			var numberValue = L.Current.GetNumberValue();
+			if (negative)
+			{
+				numberValue = -numberValue;
+			}
+			return DynValue.NewNumber(numberValue).AsReadOnly();
+		}
 	}
 }

+ 27 - 2
src/MoonSharp.Interpreter/_Projects/MoonSharp.Interpreter.netcore/src/Serialization/Json/JsonTableConverter.cs

@@ -214,9 +214,9 @@ namespace MoonSharp.Interpreter.Serialization.Json
 			{
 				return DynValue.NewString(L.Current.Text);
 			}
-			else if (L.Current.Type == TokenType.Number)
+			else if (L.Current.Type == TokenType.Number || L.Current.Type == TokenType.Op_MinusOrSub)
 			{
-				return DynValue.NewNumber(L.Current.GetNumberValue()).AsReadOnly();
+				return ParseJsonNumberValue(L, script);
 			}
 			else if (L.Current.Type == TokenType.True)
 			{
@@ -235,5 +235,30 @@ namespace MoonSharp.Interpreter.Serialization.Json
 				throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text);
 			}
 		}
+
+		private static DynValue ParseJsonNumberValue(Lexer L, Script script)
+		{
+			bool negative;
+			if (L.Current.Type == TokenType.Op_MinusOrSub)
+			{
+				// Negative number consists of 2 tokens.
+				L.Next();
+				negative = true;
+			}
+			else
+			{
+				negative = false;
+			}
+			if (L.Current.Type != TokenType.Number)
+			{
+				throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text);
+			}
+			var numberValue = L.Current.GetNumberValue();
+			if (negative)
+			{
+				numberValue = -numberValue;
+			}
+			return DynValue.NewNumber(numberValue).AsReadOnly();
+		}
 	}
 }