using Convention.RScript.Parser; using System; using System.Diagnostics.CodeAnalysis; namespace Convention.RScript.Runner { public class DefineVariableRunner : IRSentenceRunner { public void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { var varTypeName = sentence.info[0]; var varName = sentence.info[1]; var varInitExpression = sentence.info[2]; Type varType; object varDefaultValue; { if (varTypeName == "string") { varType = typeof(string); varDefaultValue = ""; } else if (varTypeName == "int") { varType = typeof(int); if (varInitExpression != null) parser.Compile(varInitExpression); varDefaultValue = 0; } else if (varTypeName == "double") { varType = typeof(double); if (varInitExpression != null) parser.Compile(varInitExpression); varDefaultValue = 0.0; } else if (varTypeName == "float") { varType = typeof(float); if (varInitExpression != null) parser.Compile(varInitExpression); varDefaultValue = 0.0f; } else if (varTypeName == "bool") { varType = typeof(bool); if (varInitExpression != null) parser.Compile(varInitExpression); varDefaultValue = false; } else if (varTypeName == "var") { varType = typeof(object); if (varInitExpression != null) parser.Compile(varInitExpression); varDefaultValue = new object(); } else { throw new RScriptRuntimeException($"Unsupported variable type '{varTypeName}'.", context.CurrentRuntimePointer); } } if (context.CurrentLocalSpaceVariableNames.Peek().Contains(varName) == false) { context.Variables.Add(varName, new(varType, default)); parser.context.Variables[varName] = varDefaultValue; context.CurrentLocalSpaceVariableNames.Peek().Add(varName); } else { throw new RScriptRuntimeException($"Variable '{varName}' already defined on this namespace.", context.CurrentRuntimePointer); } } [return: MaybeNull] public object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { // 定义变量 var varTypeName = sentence.info[0]; var varName = sentence.info[1]; var varInitExpression = sentence.info[2]; Type varType; object varDefaultValue; { if (varTypeName == "string") { varType = typeof(string); varDefaultValue = varInitExpression == null ? string.Empty : varInitExpression; } else if (varTypeName == "int") { varType = typeof(int); varDefaultValue = varInitExpression == null ? 0 : parser.Evaluate(varInitExpression); } else if (varTypeName == "double") { varType = typeof(double); varDefaultValue = varInitExpression == null ? 0.0 : parser.Evaluate(varInitExpression); } else if (varTypeName == "float") { varType = typeof(float); varDefaultValue = varInitExpression == null ? 0.0f : parser.Evaluate(varInitExpression); } else if (varTypeName == "bool") { varType = typeof(bool); varDefaultValue = varInitExpression == null ? false : parser.Evaluate(varInitExpression); } else if (varTypeName == "var") { varType = typeof(object); varDefaultValue = varInitExpression == null ? new object() : parser.Evaluate(varInitExpression); } else { throw new RScriptRuntimeException($"Unsupported variable type '{varTypeName}'.", context.CurrentRuntimePointer); } } if (context.CurrentLocalSpaceVariableNames.Peek().Contains(varName) == false) { context.Variables.Add(varName, new(varType, varDefaultValue)); parser.context.Variables[varName] = varDefaultValue; context.CurrentLocalSpaceVariableNames.Peek().Add(varName); } else { throw new RScriptRuntimeException($"Variable '{varName}' already defined on this namespace.", context.CurrentRuntimePointer); } return null; } } }