public at_mag(string nam)
 {
     name = nam;
     at1  = new atr("", -1);
     at2  = new atr("", -1);
     at3  = new atr("", -1);
 }
 public at_mag(string nam, string nam1, string nam2)
 {
     name = nam;
     at1  = new atr(nam1, -1);
     at2  = new atr(nam2, -1);
     at3  = new atr("", -1);
 }
 public at_mag(string namf, string nam1f)
 {
     this.name = namf;
     at1       = new atr(nam1f, -1);
     at2       = new atr("", -1);
     at3       = new atr("", -1);
 }
        public void whereAT(atr at, Stack <int> deltanumbers, bool ispeek) //ищем куда вставить значение атрибута
        {
            int val;
            atr dop = new atr("", -1); // буфер

            Console.Write("In whereAT with ");
            Console.WriteLine(at.nam);
            Console.Write("deltanumbers.Peek()");
            if (deltanumbers.Count > 0)
            {
                Console.WriteLine(deltanumbers.Peek().ToString());

                foreach (var item in deltanumbers)
                {
                    Console.Write(" ");
                    Console.Write(item);
                }
                Console.WriteLine();
                ArrayList atrules1 = new ArrayList();
                ArrayList atrules3 = new ArrayList();

                foreach (at_rule r in this.at_rules) //собрать массивы всех правил которые нужно попробовать
                {
                    if (deltanumbers.Count > 0)
                    {
                        if (r.right.Contains(at.nam.ToString()) && r.number == deltanumbers.Peek())
                        {
                            Console.Write("Found rule");
                            Console.Write(" with ");
                            Console.WriteLine(at.nam);

                            if (r.right.Count == 1) //копирование значения атрибута из правой части
                            {
                                atrules1.Add(r);
                            }
                            else if (r.right.Count == 3)
                            {
                                atrules3.Add(r);
                            }
                        }
                    }
                }

                Stack <int> un  = new Stack <int>();
                Stack <int> res = new Stack <int>();
                int         y   = deltanumbers.Pop();
                res = null;
                foreach (at_rule r in atrules1) //описать функции
                {
                    un = deltanumbers;
                    if (this.setATval(r.left, at.val, un, y) == false) //если в магазине его не лежит, но в дереве синтезирования есть
                    {
                        Console.WriteLine("HERE");
                        dop.nam = r.left;
                        dop.val = at.val;
                        foreach (at_rule p in this.at_rules)
                        {
                            if (p.right.Contains(dop.nam) && p.number == y)
                            {
                                if (un.Count > 0)
                                {
                                    if (un.Peek() != y)
                                    {
                                        un.Push(y);
                                    }
                                }
                                else
                                {
                                    un.Push(y);
                                }
                                Console.WriteLine("ВПИХНУЛИ ОБРАТНО ");
                                break;
                            }
                        }
                        whereAT(dop, un, false);
                    }
                    else
                    {
                        if (ispeek)
                        {
                            res = un;
                        }
                        break;
                    }
                }
                foreach (at_rule r in atrules3) //
                {
                    un = deltanumbers;
                    if (r.right[1].ToString() == "+")
                    {
                        val = this.getATval(r.right[0].ToString()) + this.getATval(r.right[2].ToString());
                        if (val > -2)                                          // -1 + -1 = -2
                        {
                            if (this.setATval(r.left, at.val, un, y) == false) //если в магазине его не лежит, но в дереве синтезирования есть
                            {
                                dop.nam = r.left;
                                dop.val = val;
                                foreach (at_rule p in this.at_rules)
                                {
                                    if (p.right.Contains(dop.nam) && p.number == y)
                                    {
                                        un.Push(y);
                                        break;
                                    }
                                }
                                whereAT(dop, un, false);
                            }
                            else if (ispeek && res == null)
                            {
                                res = un;
                            }
                        }
                        else
                        {
                            Console.Write("Error in calculating\n");
                        }
                    }
                    else if (r.right[1].ToString() == "-")
                    {
                        val = this.getATval(r.right[0].ToString());
                        int val1 = this.getATval(r.right[2].ToString());
                        if (val > -1 && val1 > -1)
                        {
                            if (this.setATval(r.left, at.val, un, y) == false) //если в магазине его не лежит, но в дереве синтезирования есть
                            {
                                dop.nam = r.left;
                                dop.val = val - val1;
                                foreach (at_rule p in this.at_rules)
                                {
                                    if (p.right.Contains(dop.nam) && p.number == y)
                                    {
                                        un.Push(y);
                                        break;
                                    }
                                }
                                whereAT(dop, deltanumbers, false);
                            }
                            else if (ispeek && res == null)
                            {
                                res = un;
                            }
                        }
                        else
                        {
                            Console.Write("Error in calculating\n");
                        }
                    }
                    else if (r.right[1].ToString() == "*")
                    {
                        val = this.getATval(r.right[0].ToString());
                        int val1 = this.getATval(r.right[2].ToString());
                        if (val > -1 && val1 > -1)
                        {
                            if (this.setATval(r.left, at.val, un, y) == false) //если в магазине его не лежит, но в дереве синтезирования есть
                            {
                                dop.nam = r.left;
                                dop.val = val * val1;
                                foreach (at_rule p in this.at_rules)
                                {
                                    if (p.right.Contains(dop.nam) && p.number == y)
                                    {
                                        un.Push(y);
                                        break;
                                    }
                                }
                                whereAT(dop, un, false);
                            }
                            else if (ispeek && res == null)
                            {
                                res = un;
                            }
                        }
                        else
                        {
                            Console.Write("Error in calculating\n");
                        }
                    }
                    else if (r.right[1].ToString() == "/")
                    {
                        val = this.getATval(r.right[0].ToString());
                        int val1 = this.getATval(r.right[2].ToString());
                        if (val > -1 && val1 > -1)
                        {
                            if (this.setATval(r.left, at.val, un, y) == false) //если в магазине его не лежит, но в дереве синтезирования есть
                            {
                                dop.nam = r.left;
                                dop.val = val / val1;
                                foreach (at_rule p in this.at_rules)
                                {
                                    if (p.right.Contains(dop.nam) && p.number == y)
                                    {
                                        un.Push(y);
                                        break;
                                    }
                                }
                                whereAT(dop, un, false);
                            } //не обрабатывает деление с остатком
                            else if (ispeek && res == null)
                            {
                                res = un;
                            }
                        }
                        else
                        {
                            Console.Write("Error in calculating\n");
                        }
                    }
                }
                if (res != null)
                {
                    if (Members_in_magazine(y) && res.Peek() != y && !is_last_atr_in_rule(at.nam, y))
                    {
                        Console.Write("res != null НЕ КОНЧИЛИСЬ СИМВОЛЫ для правила ");
                        Console.WriteLine(y);
                        res.Push(y);
                    }
                    deltanumbers = res;
                }
                else
                {
                    if (Members_in_magazine(y) && deltanumbers.Peek() != y && !is_last_atr_in_rule(at.nam, y))
                    {
                        Console.Write("res == null НЕ КОНЧИЛИСЬ СИМВОЛЫ для правила ");
                        Console.WriteLine(y);
                        deltanumbers.Push(y);
                    }
                }
            }
        }