/// <summary> /// Returns a <see cref="System.String" /> that represents this instance. /// </summary> /// <returns> /// A <see cref="System.String" /> that represents this instance. /// </returns> public override string ToString() { return ($"Inputs:\n {string.Join(",", InputsList.Select(i => "[" + i + "]" + "\n"))}{nameof(TotalBalance)}: {TotalBalance}"); }
//Семантический разбор поля Inputs private void ParseInputs() { Inputs.Clear(); InputsList.Clear(); Vars.Clear(); var inputs = (ListNode <InputNode>) new InputsParsing(Keeper, InputsStr).ResultTree; TablikVar v = null; foreach (var node in inputs.Nodes) { var varCode = node.Token.Text; if (Inputs.ContainsKey(varCode)) { Keeper.AddError("Два входа с одинаковыми именами", node); } else if (varCode.ToLower() == "расчет" || varCode.ToLower() == "calc") { Keeper.AddError("Недопустимое имя входа", node); } switch (node.InputType) { case InputType.Simple: var dt = node.TypeNode == null ? DataType.Real : node.TypeNode.Text.ToDataType(); var at = node.SubTypeNode == null ? ArrayType.Single : node.SubTypeNode.Token.Text.ToArrayType(); var val = node.ValueNode == null ? null : node.ValueNode.Mean; v = new TablikVar(varCode, new SimpleType(dt, at), val); break; case InputType.Param: if (!Module.Params.ContainsKey(node.TypeNode.Text)) { Keeper.AddError("Не найден расчетный параметр", node.TypeNode); } else { var par = Module.Params[node.TypeNode.Text]; if (node.SubTypeNode == null) { if (!par.IsFun) { Keeper.AddError("Параметр без входов не может быть типом данных входа", node.TypeNode); } else { v = new TablikVar(varCode, par); } } else if (!par.Params.ContainsKey(node.SubTypeNode.Text)) { Keeper.AddError("Не найден расчетный подпараметр", node.SubTypeNode); } else { var spar = par.Params[node.SubTypeNode.Text]; if (!spar.IsFun) { Keeper.AddError("Подпараметр без входов не может быть типом данных входа", node.SubTypeNode); } else { v = new TablikVar(varCode, spar); } } } break; case InputType.Signal: string scode = node.TypeNode.Text.Substring(1, node.TypeNode.Text.Length - 2); ObjectTypeBase t = null; foreach (var con in Module.LinkedSources) { if (con.ObjectsTypes.ContainsKey(scode)) { if (t == null) { t = con.ObjectsTypes[scode]; } else { Keeper.AddError("Одинаковый код типа объекта в двух разных источниках", node); } } else if (con.BaseObjectsTypes.ContainsKey(scode)) { if (t == null) { t = con.BaseObjectsTypes[scode]; } else { Keeper.AddError("Одинаковый код типа объекта в двух разных источниках", node); } } } if (t != null) { v = new TablikVar(varCode, t) { MetSignals = new SetS(), MetProps = new SetS() } } ; else { Keeper.AddError("Не найден тип объекта или сигнала", node); } break; } if (v != null) { if (Inputs.ContainsKey(v.Code)) { Keeper.AddError("Два входа с одинаковыми именами", node); } else { if (v.DefaultValue == null && InputsList.Count > 0 && InputsList[InputsList.Count - 1].DefaultValue != null) { Keeper.AddError("Входы со значениямия по умолчанию должны располагаться в конце списка входов", node); } InputsList.Add(Vars.Add(v.Code, Inputs.Add(v.Code, v))); } } } }