//Определение типов данных и формирование порожденных параметров public void DefineDataTypes() { foreach (var node in Expr1.Nodes) { node.DefineType(); } var last = Expr1.Nodes.Last(); if (last.Type.DataType != DataType.Void) { var resVar = Vars["calc"]; resVar.Type = resVar.Type.Add(last.Type); } foreach (var node in Expr2.Nodes) { node.DefineType(); } last = Expr2.Nodes.Last(); Type = last.Type; if (Type is ObjectType || Type is BaseObjectType) { MetSignals = Keeper.GetMetSignals(last); MetProps = Keeper.GetMetProps(last); } }
//Сформировать используемые сигналы и свойства по входам типа объекта private void MakeUsedMetSignals() { for (int i = 0; i < Args.Length; i++) { var imet = Param.InputsList[i].MetSignals; if (imet != null) { var amet = Keeper.GetMetSignals(Args[i]); if (amet != null) { foreach (var m in imet.Values) { amet.Add(m); } } if (Args[i].Type is TablikObject) { var ob = (TablikObject)Args[i].Type; var sigs = ob.ObjectType.Signals; foreach (var sigCode in imet.Values) { if (ob.UsedSignals.Contains(sigs[sigCode])) { ob.UsedSignals.Add(sigs[sigCode]); } } } } var iprop = Param.InputsList[i].MetProps; if (iprop != null) { var aprop = Keeper.GetMetProps(Args[i]); if (aprop != null) { foreach (var p in iprop.Values) { aprop.Add(p); } } if (Args[i].Type is TablikObject) { var ob = (TablikObject)Args[i].Type; foreach (var propCode in iprop.Values) { if (ob.UsedProps.ContainsKey(propCode)) { ob.UsedProps.Add(propCode, ob.Props[propCode]); } } } } } }
//Определение типа данных public override void DefineType() { var t = Parent.Type; var code = Token.Text.Substring(1, Token.Text.Length - 2); var metSignals = Keeper.GetMetSignals(Parent); if (t is TablikObject || t is ObjectType) { var type = t is ObjectType ? (ObjectType)t : ((TablikObject)t).ObjectType; if (type.Signals.ContainsKey(code)) { Type = type.Signals[code]; if (metSignals != null) { metSignals.Add(code); } else { ((TablikObject)t).UsedSignals.Add((TablikSignal)Type); } } else { AddError("Не найден сигнал"); } } else if (t is BaseObjectType) { var type = (BaseObjectType)t; if (type.Signals.ContainsKey(code)) { Type = type.Signals[code]; metSignals.Add(code); } else { AddError("Не найден сигнал"); } } else { AddError("Взятие сигнала от выражения, не являющегося объектом"); } if (Type == null) { Type = new SimpleType(); } }
//Определение типа данных public override void DefineType() { var val = Args[0]; Var.Type = Var.Type.Add(val.Type); if (Var.Type.DataType == DataType.Error) { AddError("Несовместимость типов данных при присвоении переменной"); } Type = new SimpleType(DataType.Void); if (Var.Type is ObjectType || Var.Type is BaseObjectType) { Var.MetSignals = Keeper.GetMetSignals(val); Var.MetProps = Keeper.GetMetProps(val); } }