示例#1
0
        public GraficNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args)
            : base(keeper, terminal, args)
        {
            string code = Token.Text;

            if (Keeper.Module.Grafics.ContainsKey(code))
            {
                Grafic = Keeper.Module.Grafics[code];
            }
            foreach (var m in Keeper.Module.LinkedModules)
            {
                if (m.Grafics.ContainsKey(code))
                {
                    Grafic = m.Grafics[code];
                }
            }
            if (Grafic == null)
            {
                AddError("Не найден график");
            }
            else
            {
                if (args.Length != Grafic.Dim)
                {
                    AddError("Количество аргументов функции не совпадает с рамерностью графика");
                }
                else if (args.Any(arg => !arg.Type.DataType.LessOrEquals(DataType.Real)))
                {
                    AddError("Недопустимые аргументы функции График");
                }
            }
        }
示例#2
0
        public TablikCalcParam(TablikModule module, IRecordRead rec, bool isSubParam, bool isGenerated)
            : base(rec, isSubParam)
        {
            Module      = module;
            Keeper      = new TablikKeeper(this);
            IsGenerated = isGenerated;
            if (!Code.IsCorrectCode())
            {
                ErrMess     += "Указан недопустимый код расчетного параметра; ";
                IsFatalError = true;
            }

            CalcOn    = rec.GetBool("CalcOn");
            UserExpr1 = rec.GetString("UserExpr1", "");
            if (UserExpr1 == "")
            {
                ErrMess     += "Не заполнено расчетное выражение; ";
                IsFatalError = true;
            }
            UserExpr2 = rec.GetString("UserExpr2", "");
            if (UserExpr2 == "")
            {
                ErrMess     += "Не заполнено управляющее выражение; ";
                IsFatalError = true;
            }
            InputsStr = rec.GetString("Inputs");

            JoinToParamTree();
        }
示例#3
0
 //Конструктор для тестов
 public TablikCalcParam(TablikModule module, string code, string expr1, string expr2 = "Расчет")
     : base(false)
 {
     Module    = module;
     Code      = code;
     UserExpr1 = expr1;
     UserExpr2 = expr2;
     Keeper    = new TablikKeeper(this);
 }
示例#4
0
        public ParamNode(TablikKeeper keeper, ITerminalNode terminal, TablikCalcParam param, IEnumerable <IExprNode> args = null)
            : base(keeper, terminal)
        {
            Param = param;
            Args  = args != null?args.ToArray() : new IExprNode[0];

            if (Keeper.Module == param.Module && !Keeper.Param.UsedParams.ContainsKey(param))
            {
                Keeper.Param.UsedParams.Add(param, terminal.Symbol);
            }
        }
示例#5
0
        public TablNode(TablikKeeper keeper, ITerminalNode fun, ITerminalNode tabl, ITerminalNode field, params IExprNode[] args)
            : base(keeper, fun, args)
        {
            Fun = Keeper.FunsChecker.Funs[Token.Text];
            var t = tabl.Symbol.Text;

            if (Keeper.Module.Tabls.Structs.ContainsKey(t))
            {
                Tabl = Keeper.Module.Tabls.Structs[t];
            }
            else
            {
                foreach (var m in Keeper.Module.LinkedModules)
                {
                    if (m.Tabls.Structs.ContainsKey(t))
                    {
                        if (Tabl != null)
                        {
                            AddError("Таблица присутствует сразу в нескольких модулях");
                        }
                        else
                        {
                            Tabl = m.Tabls.Structs[t];
                        }
                    }
                }
            }
            if (Tabl == null)
            {
                AddError("Не найдена таблица");
            }
            else
            {
                int tnum = Fun.Code == "tabl" || Fun.Code == "tablcontains" ? Args.Length - 1 : Args.Length;
                if (Tabl.Tabls.Count - 1 < tnum)
                {
                    AddError("Недопустимое количество аргументов функции");
                }
                else if (field != null)
                {
                    Field = field.Symbol.Text;
                    var fields = Tabl.Tabls[tnum].Fields;
                    if (!fields.ContainsKey(Field))
                    {
                        AddError("В таблице не найдено указанное поле", field.Symbol);
                    }
                    else
                    {
                        FieldType = fields[Field];
                    }
                }
            }
        }
示例#6
0
        public SignalNode(TablikKeeper keeper, ITerminalNode terminal)
            : base(keeper, terminal)
        {
            var    code = terminal.Symbol.Text.Substring(1, terminal.Symbol.Text.Length - 2);
            string ocode = null, scode = null;
            int    pos = code.LastIndexOf('.');

            if (pos != -1)
            {
                scode = code.Substring(pos + 1);
                ocode = code.Substring(0, pos);
            }
            else
            {
                ocode = code.Substring(1, code.Length - 2);
            }

            foreach (var source in Keeper.Project.Sources.Values)
            {
                var objs  = source.Objects;
                var uobjs = Keeper.Module.UsedObjects;
                if (objs.ContainsKey(code))
                {
                    if (Object != null)
                    {
                        AddError("Указанный объект присутствует в нескольких источниках");
                    }
                    Object    = objs[ocode = code];
                    Signal    = Object.Signal;
                    _isObject = true;
                }
                else if (pos != -1 && objs.ContainsKey(ocode) && objs[ocode].ObjectType.Signals.ContainsKey(scode))
                {
                    if (Object != null)
                    {
                        AddError("Указанный сигнал присутствует в нескольких источниках");
                    }
                    Object    = objs[ocode];
                    Signal    = Object.ObjectType.Signals[scode];
                    _isObject = false;
                }
                if (!uobjs.ContainsKey(ocode))
                {
                    uobjs.Add(ocode, Object);
                }
                if (!Object.UsedSignals.Contains(Signal))
                {
                    Object.UsedSignals.Add(Signal);
                }
            }
        }
示例#7
0
 public PrevNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args)
     : base(keeper, terminal, args)
 {
     if (args.Length == 2)
     {
         Def = args[1];
     }
     if (!(args[0].Type is TablikCalcParam))
     {
         AddError("Аргумент функции Абсолют должен задавать расчетный параметр", args[0].Token);
     }
     else
     {
         Param = (TablikCalcParam)args[0].Type;
     }
 }
示例#8
0
 public IfNode(TablikKeeper keeper, ITerminalNode terminal, IEnumerable <IExprNode> conditions, IEnumerable <IExprNode> variants)
     : base(keeper, terminal)
 {
     _conditions = conditions.ToList();
     _variants   = variants.ToList();
     Args        = new IExprNode[_conditions.Count + _variants.Count];
     for (int i = 0; i < _conditions.Count; i++)
     {
         Args[2 * i]     = _conditions[i];
         Args[2 * i + 1] = _variants[i];
     }
     if (_variants.Count > _conditions.Count)
     {
         Args[Args.Length - 1] = _variants[_variants.Count - 1];
     }
 }
示例#9
0
        public AssignNode(TablikKeeper keeper, ITerminalNode assign, ITerminalNode v, IExprNode expr, IExprNode type = null)
            : base(keeper, assign, expr)
        {
            var vcode = v.Symbol.Text;
            var vars  = Keeper.Param.Vars;

            if (vars.ContainsKey(vcode))
            {
                Var = vars[vcode];
            }
            else
            {
                vars.Add(vcode, Var = new TablikVar(vcode, type == null ? null : type.Type));
            }
            if (Keeper.Param.Inputs.ContainsKey(vcode))
            {
                AddError("Нельзя присваивать значение входу");
            }
        }
示例#10
0
        public ParamTypeNode(TablikKeeper keeper, IEnumerable <ITerminalNode> codes)
            : base(keeper, codes.First())
        {
            ISubParams p = Keeper.Module;

            foreach (var code in codes)
            {
                if (p.Params.ContainsKey(code.Symbol.Text))
                {
                    p = p.Params[code.Symbol.Text];
                }
                else
                {
                    AddError("Не найден " + (p == Keeper.Module ? "" : "под") + "параметр", code.Symbol);
                    Type = new SimpleType();
                }
            }
            if (Type == null)
            {
                Type = (TablikCalcParam)p;
            }
        }
示例#11
0
        public SignalTypeNode(TablikKeeper keeper, ITerminalNode terminal)
            : base(keeper, terminal)
        {
            var signalCode = Token.Text.Substring(1, Token.Text.Length - 2);

            foreach (var con in Keeper.Module.LinkedSources)
            {
                if (con.ObjectsTypes.ContainsKey(signalCode))
                {
                    Type = con.ObjectsTypes[signalCode];
                }
                else if (con.BaseObjectsTypes.ContainsKey(signalCode))
                {
                    Type = con.BaseObjectsTypes[signalCode];
                }
            }
            if (Type == null)
            {
                AddError("Не найден тип объекта или сигнала");
                Type = new SimpleType();
            }
        }
示例#12
0
 public MetSignalNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode parent)
     : base(keeper, terminal, parent)
 {
     Parent = parent;
 }
示例#13
0
 public SubParamsNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode expr)
     : base(keeper, terminal, expr)
 {
 }
示例#14
0
 public MetNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode parent, params IExprNode[] args)
     : base(keeper, terminal, args)
 {
     Parent = parent;
     IsMet  = true;
 }
示例#15
0
 public ParamPropNode(TablikKeeper keeper, ITerminalNode terminal, ITerminalNode prop)
     : base(keeper, terminal)
 {
     IsMet = true;
     Prop  = prop.Symbol;
 }
示例#16
0
 internal ExprVisitor(TablikKeeper keeper)
 {
     _keeper = keeper;
 }
示例#17
0
 public WhileNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode condition, IExprNode prog)
     : base(keeper, terminal, condition, prog)
 {
 }
示例#18
0
 //Тип данных
 protected TablikKeeperNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args)
     : base(keeper, terminal)
 {
     Args = args;
 }
示例#19
0
 public ForNode(TablikKeeper keeper, ITerminalNode terminal, TablikVar v, IExprNode array, IExprNode prog)
     : base(keeper, terminal, array, prog)
 {
     Var = v;
 }
示例#20
0
 public ObjectPropNode(TablikKeeper keeper, IExprNode parent, ITerminalNode terminal, ITerminalNode prop)
     : base(keeper, terminal)
 {
     Parent = parent;
     Prop   = prop.Symbol;
 }
示例#21
0
 protected KeeperNode(TablikKeeper keeper, ITerminalNode terminal)
     : base(terminal)
 {
     Keeper = keeper;
 }
示例#22
0
 public OwnerNode(TablikKeeper keeper, ITerminalNode terminal)
     : base(keeper, terminal)
 {
 }
示例#23
0
 public FunNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args)
     : base(keeper, terminal, args)
 {
     Fun = Keeper.FunsChecker.Funs[Token.Text];
 }