Пример #1
0
        public GenRow(ModuleGenerator generator,                //Ссылка на генератор
                      TablsList dataTabls,                      //Исходные таблицы для генерации
                      GenTemplateTable table, DaoRec rec,       //Рекортсет и поля таблицы
                      GenTemplateTable subTable, DaoRec subRec) //Рекордсет и и поля подтаблицы
            : base(generator, table, rec)
        {
            Id = rec.GetInt(table.IdField);
            var dataTabl = Rule == null ? null : ((NodeRTabl)Rule).Check(dataTabls, null);

            foreach (var key in Fields.Keys)
            {
                Keeper.SetFieldName(key);
                Fields[key].Check(dataTabl);
            }
            if (subRec != null && !subRec.EOF)
            {
                Keeper.SetFieldName("");
                bool subErr = false;
                while (subRec.GetInt(subTable.ParentIdField) == Id)
                {
                    var row = new GenSubRow(generator, dataTabls, dataTabl, subTable, subRec);
                    if (row.Keeper.Errors.Count != 0 && !subErr)
                    {
                        Keeper.AddError("Ошибки в рядах подтаблицы", (IToken)null);
                        subErr = true;
                    }
                    SubRows.Add(row);
                    if (!subRec.MoveNext())
                    {
                        break;
                    }
                }
            }
            rec.Put(table.ErrField, Keeper.ErrMess);
        }
Пример #2
0
        public override INode VisitStatementAction(P.StatementActionContext context)
        {
            var code = context.IDENT(0).Symbol.Text;
            var sn   = new StatementNode(context.IDENT(1),
                                         code,
                                         GoCalc(context.expr()));

            try { var it = GroupShape.GroupItems.Item(code); }
            catch { Keeper.AddError("Не найдена фигура", context.IDENT(0)); }
            if (sn.Token.Text == null || !_allowedProps.Contains(sn.Token.Text.ToLower()))
            {
                Keeper.AddError("Недопустимое имя свойства", sn.Token);
            }
            return(sn);
        }
Пример #3
0
        //Проверка выражения
        public ITablStruct Check(TablsList dataTabls, ITablStruct tablParent)
        {
            var gstruct = new RowGroupStruct((TablStruct)tablParent, _fields);

            foreach (var field in _fieldsNodes)
            {
                var s = ((ConstNode)field).Mean.String;
                if (!tablParent.Fields.ContainsKey(s))
                {
                    Keeper.AddError("Поле для группировки не найдено в таблице", field);
                }
                else
                {
                    gstruct.Fields.Add(s, tablParent.Fields[s]);
                }
            }
            return(gstruct);
        }
Пример #4
0
 public void Dfs(List <TablikCalcParam> paramsOrder) //Параметры, упорядоченные по порядку обсчета
 {
     DfsStatus = DfsStatus.Process;
     foreach (var p in UsedParams.Keys)
     {
         if (p.DfsStatus == DfsStatus.Before)
         {
             p.Dfs(paramsOrder);
         }
         else if (p.DfsStatus == DfsStatus.Process)
         {
             Keeper.AddError("Циклическая зависимость параметров", UsedParams[p]);
         }
     }
     paramsOrder.Add(this);
     foreach (var p in Params.Values)
     {
         p.Dfs(paramsOrder);
     }
     DfsStatus = DfsStatus.After;
 }
Пример #5
0
        //Семантический разбор поля 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)));
                    }
                }
            }
        }