static private string GetValueFromTable(string Variable, string VarPath, out MemorySlot Value) { foreach (var block in OpenedBlocks) { var vrb = block.variables.Find((variable) => variable.Name == Variable); if (vrb != null) { var DestinationTable = vrb.Data.Data; string NormalPath; var res = GetNormalizedPath(VarPath, out NormalPath); if (res != null) { Value = new MemorySlot(); return(res); } var PathList = NormalPath.Split(Separator, StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < PathList.Length - 1; i++) { MemorySlot tmp_slot; try { tmp_slot = Tables[Convert.ToInt32(DestinationTable)].GetValue(PathList[i]); } catch { Value = new MemorySlot(); return("BAD_TYPE"); } if (tmp_slot.DataType != "Table") { Value = new MemorySlot(); return("BAD_TYPE"); } DestinationTable = tmp_slot.Data; } Value = Tables[Convert.ToInt32(DestinationTable)].GetValue(PathList[PathList.Length - 1]); return(null); } } Value = new MemorySlot(); return("BADNAME_VARIABLE"); }
static private string UpdateVariableInTable(ref int NextIndex, ref int line_ptr, string Command, Variable variable, string VarPath, bool IsFunc = false) { var DestinationTable = variable.Data.Data; string NormalPath; var res = GetNormalizedPath(VarPath, out NormalPath); if (res != null) { return(res); } var PathList = NormalPath.Split(Separator, StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < PathList.Length - 1; i++) { MemorySlot tmp_slot; try { tmp_slot = Tables[Convert.ToInt32(DestinationTable)].GetValue(PathList[i]); } catch { return("BAD_TYPE"); } if (tmp_slot.DataType != "Table") { return("BAD_TYPE"); } DestinationTable = tmp_slot.Data; } MemorySlot variable_data = new MemorySlot(); if (GetNextSymbol(Command, ref NextIndex, ref line_ptr) == '=') { if (CheckNextSymbol(Command, NextIndex, '{')) { variable_data = new MemorySlot("Table"); res = InitTable(ref NextIndex, ref line_ptr, Command, Convert.ToInt32(variable_data.Data)); if (res != null) { return(res); } } else { string expression; var result = GetNextExpression(Command, ref NextIndex, ref line_ptr, out expression, IsFunc); if (!result) { return("BAD_EXPRESSION"); } res = InterpretExpression(expression, out variable_data); if (res != null) { return(res); } } Tables[Convert.ToInt32(DestinationTable)].AddUpdateValue(PathList[PathList.Length - 1], variable_data); return(null); } else { return("BAD_EXPRESSION"); } }