示例#1
0
 public static void Reset()
 {
     Flags.Clear();
     Vars.Clear();
     StringVars.Clear();
     ActiveSpellTargets.Clear();
 }
示例#2
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)));
                    }
                }
            }
        }
示例#3
0
        private void WriteModule(SynModule mod)
        {
            Tab = 1;
            WriteClassHeader(mod.DirectModule.ModuleName);

            ClassVars.Clear();

            foreach (var v in mod.DirectModule.Vars)
            {
                // WriteVar(v);
                Console.WriteLine("Var:" + v.Name);
                ClassVars.Add(v.Name);
            }

            foreach (var v in mod.DirectModule.StaticVars)
            {
                // WriteStaticVar(v);
                Console.WriteLine("Var:" + v.Name);
                ClassVars.Add(v.Name);
            }



            foreach (var meth in mod.DirectModule.Methods)
            {
                AddVars(meth.Code);
            }

            foreach (var func in mod.DirectModule.StaticFuncs)
            {
                AddVars(func.Code);
            }
            foreach (var v in Vars)
            {
                bool add = true;
                foreach (var cv in ClassVars)
                {
                    if (cv == v)
                    {
                        add = false;
                        break;
                    }
                }
                if (add)
                {
                    ClassVars.Add(v);
                }
            }

            foreach (var cv in ClassVars)
            {
                Tab = 2;
                Write("public dynamic " + cv + " = null;");
            }


            Vars.Clear();


            foreach (var meth in mod.DirectModule.Methods)
            {
                if (meth.FuncName == mod.DirectModule.ModuleName)
                {
                    Tab = 3;
                    WriteNewFunc(meth);
                }
                else
                {
                    Tab = 3;
                    WriteFunc(meth);
                }
            }
            Tab = 2;
            WriteClassFooter();
        }
示例#4
0
 public void ClearScope()
 {
     Vars.Clear();
 }
示例#5
0
 public override void SetFieldName(string fieldName)
 {
     base.SetFieldName(fieldName);
     Vars.Clear();
 }