diff --git a/DoRunner/DefineVariableRunner.cs b/DoRunner/DefineVariableRunner.cs index 54e92a9..15d10b4 100644 --- a/DoRunner/DefineVariableRunner.cs +++ b/DoRunner/DefineVariableRunner.cs @@ -79,7 +79,7 @@ namespace Convention.RScript.Runner if (varTypeName == "string") { varType = typeof(string); - varDefaultValue = varInitExpression == null ? string.Empty : varInitExpression; + varDefaultValue = varInitExpression == null ? string.Empty : varInitExpression.Trim('\"'); } else if (varTypeName == "int") { diff --git a/DoRunner/ExitNamespaceRunner.cs b/DoRunner/ExitNamespaceRunner.cs index 5303372..bb1e3ec 100644 --- a/DoRunner/ExitNamespaceRunner.cs +++ b/DoRunner/ExitNamespaceRunner.cs @@ -22,7 +22,14 @@ namespace Convention.RScript.Runner // 还原上层命名空间的变量 foreach (var local in context.CurrentLocalSpaceVariableNames.Peek()) { - parser.context.Variables[local] = context.Variables[local].data; + if (context.Variables.ContainsKey(local)) + { + parser.context.Variables[local] = context.Variables[local].data; + } + else + { + parser.context.Variables.Remove(local); + } } context.CurrentLocalSpaceVariableNames.Pop(); // 弹栈 diff --git a/Parser/ExpressionParser.cs b/Parser/ExpressionParser.cs index 393f390..4e717fa 100644 --- a/Parser/ExpressionParser.cs +++ b/Parser/ExpressionParser.cs @@ -97,6 +97,14 @@ namespace Convention.RScript.Parser this.context = context; // 默认启用未定义标识符作为字符串的功能 this.context.Options.UndefinedIdentifiersAsStrings = true; + // 启用大小写敏感 + this.context.Options.CaseSensitive = true; + // 启用溢出检查 + this.context.Options.Checked = true; +#if UNITY_EDITOR + // 浮点数使用float而非double(Unity性能优化) + this.context.Options.RealLiteralDataType = RealLiteralDataType.Single; +#endif } private readonly Dictionary CompileGenericExpressionTypen = new(); diff --git a/PublicTypes/RScriptVariables.cs b/PublicTypes/RScriptVariables.cs index a585855..bcf3555 100644 --- a/PublicTypes/RScriptVariables.cs +++ b/PublicTypes/RScriptVariables.cs @@ -32,7 +32,7 @@ namespace Convention.RScript else internalData = Activator.CreateInstance(type); } - else if (type == typeof(object) || type == value.GetType()) + else if (type == typeof(object) || type.IsAssignableFrom(value.GetType())) internalData = value; else internalData = Convert.ChangeType(value, type);