示例#1
0
        //Определение типов данных и формирование порожденных параметров
        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);
            }
        }
示例#2
0
        //Сформировать используемые сигналы и свойства по входам типа объекта
        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]);
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        //Определение типа данных
        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();
            }
        }
示例#4
0
        //Определение типа данных
        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);
            }
        }