Beispiel #1
0
        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);
        }
Beispiel #2
0
 public GFScriptPartDelegateAndAnother(string methodName, GFScriptPartDelegate method)
 {
     MethodName = methodName;
     Method     = method;
 }