async Task ProcessCanonicalForAsync(ParsingScript script, string forString) { string[] forTokens = forString.Split(Constants.END_STATEMENT); if (forTokens.Length != 3) { throw new ArgumentException("Expecting: for(init; condition; loopStatement)"); } int startForCondition = script.Pointer; ParsingScript initScript = script.GetTempScript(forTokens[0] + Constants.END_STATEMENT); ParsingScript condScript = script.GetTempScript(forTokens[1] + Constants.END_STATEMENT); ParsingScript loopScript = script.GetTempScript(forTokens[2] + Constants.END_STATEMENT); await initScript.ExecuteAsync(null, 0); int cycles = 0; bool stillValid = true; while (stillValid) { Variable condResult = await condScript.ExecuteAsync(null, 0); stillValid = Convert.ToBoolean(condResult.Value); if (!stillValid) { break; } if (MAX_LOOPS > 0 && ++cycles >= MAX_LOOPS) { throw new ArgumentException("Looks like an infinite loop after " + cycles + " cycles."); } script.Pointer = startForCondition; Variable result = await ProcessBlockAsync(script); if (result.IsReturn || result.Type == Variable.VarType.BREAK) { //script.Pointer = startForCondition; //SkipBlock(script); //return; break; } await loopScript.ExecuteAsync(null, 0); } script.Pointer = startForCondition; SkipBlock(script); }
public static Variable GetVariableFromString(string str, ParsingScript script, int startIndex = 0) { ParsingScript tempScript = script.GetTempScript(str, startIndex); Variable result = Utils.GetItem(tempScript); return(result); }
public static async Task <List <Variable> > GetArgsAsync(ParsingScript script, char start, char end, Action <bool> outList) { List <Variable> args = new List <Variable>(); bool isList = script.StillValid() && script.Current == Constants.START_GROUP; if (!script.StillValid() || script.Current == Constants.END_STATEMENT) { return(args); } ParsingScript tempScript = script.GetTempScript(script.String, script.Pointer); /*ParsingScript tempScript = new ParsingScript(script.String, script.Pointer); * tempScript.ParentScript = script; * tempScript.InTryBlock = script.InTryBlock;*/ if (script.Current != start && script.TryPrev() != start && (script.Current == ' ' || script.TryPrev() == ' ')) { // Allow functions with space separated arguments start = ' '; end = Constants.END_STATEMENT; } // ScriptingEngine - body is unsed (used in Debugging) but GetBodyBetween has sideeffects #pragma warning disable 219 string body = Utils.GetBodyBetween(tempScript, start, end); #pragma warning restore 219 // After the statement above tempScript.Parent will point to the last // character belonging to the body between start and end characters. while (script.Pointer < tempScript.Pointer) { Variable item = await Utils.GetItemAsync(script, false); args.Add(item); if (script.Pointer < tempScript.Pointer) { script.MoveForwardIf(Constants.END_GROUP); script.MoveForwardIf(Constants.NEXT_ARG); } if (script.Pointer == tempScript.Pointer - 1) { script.MoveForwardIf(Constants.END_ARG, Constants.END_GROUP); } } if (script.Pointer <= tempScript.Pointer) { // Eat closing parenthesis, if there is one, but only if it closes // the current argument list, not one after it. script.MoveForwardIf(Constants.END_ARG, end); } script.MoveForwardIf(Constants.SPACE); //script.MoveForwardIf(Constants.SPACE, Constants.END_STATEMENT); outList(isList); return(args); }
async Task ProcessArrayForAsync(ParsingScript script, string forString) { var tokens = forString.Split(' '); var sep = tokens.Length > 2 ? tokens[1] : ""; string varName = tokens[0]; if (sep != Constants.FOR_EACH && sep != Constants.FOR_IN && sep != Constants.FOR_OF) { int index = forString.IndexOf(Constants.FOR_EACH); if (index <= 0 || index == forString.Length - 1) { Utils.ThrowErrorMsg("Expecting: for(item :/in/of array)", script, Constants.FOR); } varName = forString.Substring(0, index); } ParsingScript forScript = script.GetTempScript(forString, varName.Length + sep.Length + 1); forScript.Debugger = script.Debugger; Variable arrayValue = await Utils.GetItemAsync(forScript); if (arrayValue.Type == Variable.VarType.STRING) { arrayValue = new Variable(new List <string>(arrayValue.ToString().ToCharArray().Select(c => c.ToString()))); } int cycles = arrayValue.Count; if (cycles == 0) { SkipBlock(script); return; } int startForCondition = script.Pointer; for (int i = 0; i < cycles; i++) { script.Pointer = startForCondition; Variable current = arrayValue.GetValue(i); ParserFunction.AddGlobalOrLocalVariable(varName, new GetVarFunction(current)); Variable result = await ProcessBlockAsync(script); if (result.IsReturn || result.Type == Variable.VarType.BREAK) { //script.Pointer = startForCondition; //SkipBlock(script); //return; break; } } script.Pointer = startForCondition; SkipBlock(script); }
async Task ProcessArrayForAsync(ParsingScript script, string forString) { int index = forString.IndexOf(Constants.FOR_EACH); if (index <= 0 || index == forString.Length - 1) { throw new ArgumentException("Expecting: for(item : array)"); } string varName = forString.Substring(0, index); ParsingScript forScript = script.GetTempScript(forString, index + Constants.FOR_EACH.Length); forScript.Debugger = script.Debugger; Variable arrayValue = await Utils.GetItemAsync(forScript); if (arrayValue.Type == Variable.VarType.STRING) { arrayValue = new Variable(new List <string>(arrayValue.ToString().ToCharArray().Select(c => c.ToString()))); } int cycles = arrayValue.Count; if (cycles == 0) { SkipBlock(script); return; } int startForCondition = script.Pointer; for (int i = 0; i < cycles; i++) { script.Pointer = startForCondition; Variable current = arrayValue.GetValue(i); ParserFunction.AddGlobalOrLocalVariable(varName, new GetVarFunction(current)); Variable result = await ProcessBlockAsync(script); if (result.IsReturn || result.Type == Variable.VarType.BREAK) { //script.Pointer = startForCondition; //SkipBlock(script); //return; break; } } script.Pointer = startForCondition; SkipBlock(script); }
protected override Variable Evaluate(ParsingScript script) { List<Variable> args = script.GetFunctionArgs(); Utils.CheckArgs(args.Count, 1, m_name); string json = args[0].AsString(); Dictionary<int, int> d; json = Utils.ConvertToScript(json, out d); var tempScript = script.GetTempScript(json); Variable result = ExtractValue(tempScript); return result; }
public static async Task <List <Variable> > GetArrayIndicesAsync(ParsingScript script, string varName, int end, Action <string, int> updateVals) { List <Variable> indices = new List <Variable>(); int argStart = varName.IndexOf(Constants.START_ARRAY); if (argStart < 0) { return(indices); } int firstIndexStart = argStart; while (argStart < varName.Length && varName[argStart] == Constants.START_ARRAY) { int argEnd = varName.IndexOf(Constants.END_ARRAY, argStart + 1); if (argEnd == -1 || argEnd <= argStart + 1) { break; } ParsingScript tempScript = script.GetTempScript(varName, argStart); /*ParsingScript tempScript = new ParsingScript(varName, argStart); * tempScript.ParentScript = script; * tempScript.Char2Line = script.Char2Line; * tempScript.Filename = script.Filename; * tempScript.OriginalScript = script.OriginalScript; * tempScript.InTryBlock = script.InTryBlock;*/ tempScript.MoveForwardIf(Constants.START_ARG, Constants.START_ARRAY); Variable index = await tempScript.ExecuteAsync(Constants.END_ARRAY_ARRAY); indices.Add(index); argStart = argEnd + 1; } if (indices.Count > 0) { varName = varName.Substring(0, firstIndexStart); end = argStart - 1; } updateVals(varName, end); return(indices); }
public static List <Variable> GetArrayIndices(ParsingScript script, string varName, int end, Action <string, int> updateVals) { List <Variable> indices = new List <Variable>(); int argStart = varName.IndexOf(Constants.START_ARRAY); if (argStart < 0) { return(indices); } int firstIndexStart = argStart; while (argStart < varName.Length && varName[argStart] == Constants.START_ARRAY) { int argEnd = varName.IndexOf(Constants.END_ARRAY, argStart + 1); if (argEnd == -1 || argEnd <= argStart + 1) { break; } ParsingScript tempScript = script.GetTempScript(varName, argStart); tempScript.MoveForwardIf(Constants.START_ARG, Constants.START_ARRAY); Variable index = tempScript.Execute(Constants.END_ARRAY_ARRAY); indices.Add(index); argStart = argEnd + 1; } if (indices.Count > 0) { varName = varName.Substring(0, firstIndexStart); end = argStart - 1; } updateVals(varName, end); return(indices); }