GFScriptGlobalDelegate ParseScript(string script, out string parseResult, bool showParseResult) { //Parsing to text List <string> expressions = SplitScriptText(script); var methodNameAndArgsStringsList = new List <MethodNameAndArgsStrings>(); for (int i = 0; i < expressions.Count; i++) { var tuple = SplitScriptExpression(expressions[i]); methodNameAndArgsStringsList.Add( new MethodNameAndArgsStrings( tuple.Item1, SplitScriptExpressionArgs(tuple.Item2) ) ); } //Convert arguments to normal values var methodNameAndArgsList = new List <MethodNameAndArgs>(); for (int i = 0; i < methodNameAndArgsStringsList.Count; i++) { methodNameAndArgsList.Add( new MethodNameAndArgs( methodNameAndArgsStringsList[i].MethodName, PrepareScriptExpressionArgs(methodNameAndArgsStringsList[i].Arguments) ) ); } //Parse result if (showParseResult) { StringBuilder parseResultSB = new StringBuilder(); for (int i = 0; i < methodNameAndArgsStringsList.Count; i++) { parseResultSB.AppendLine(string.Format("<<<{0}>>>\n<<<{1}>>>", methodNameAndArgsStringsList[i], methodNameAndArgsList[i])); parseResultSB.AppendLine("-----------------------------------------"); parseResultSB.AppendLine(); parseResultSB.AppendLine(); } parseResult = parseResultSB.ToString(); } else { parseResult = null; } //Create parts of method List <GFScriptPartDelegateAndAnother> partsOfParsedAction = new List <GFScriptPartDelegateAndAnother>(); for (int i = 0; i < methodNameAndArgsList.Count; i++) { var methodNameAndArgs = methodNameAndArgsList[i]; if (BindedMethods.ContainsKey(methodNameAndArgs.MethodName)) { var bindedAct = BindedMethods[methodNameAndArgs.MethodName]; GFScriptPartDelegate newAct = (object inputObject) => { bindedAct(inputObject, methodNameAndArgs.Arguments); }; partsOfParsedAction.Add(new GFScriptPartDelegateAndAnother(methodNameAndArgs.MethodName, newAct)); } else { throw new GFScriptParseException(string.Format("Haven`t method binded to method name \"{0}\".", methodNameAndArgsList[i].MethodName)); } } //Finally create parsed method. GFScriptGlobalDelegate parsedAction = (inputObject) => { StringBuilder debugInfo = new StringBuilder(); foreach (var item in partsOfParsedAction) { string partOfDebugInfo = string.Format("Run ---> {0};\n", item?.MethodName ?? "null"); try { item.Method?.Invoke(inputObject); } catch (Exception scriptRuntimeEx) { partOfDebugInfo += string.Format("Exception ---> {0};", scriptRuntimeEx.Message.Replace("\n", "\n\t")); } debugInfo.AppendLine(partOfDebugInfo); } return(debugInfo.ToString()); }; return(parsedAction); }
public GFScriptPartDelegateAndAnother(string methodName, GFScriptPartDelegate method) { MethodName = methodName; Method = method; }