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); } } } }