public bool is_last_atr_in_rule(string nameatr, int number) //если это последний операционный символ правила { DeltaQSigmaGammaSix1 rule = (DeltaQSigmaGammaSix1)this.DeltaList[number - 1]; if (rule.rightSix.Count > 0) { at_mag buf = findATop((string)(rule.rightSix[rule.rightSix.Count - 1])); if (buf != null) { Console.Write("ИМЯ ЭТОГО МУДАКА "); Console.Write(buf.name); Console.Write(", buf.at3.nam: "); Console.Write(buf.at3.nam); Console.Write("; nameatr: "); Console.WriteLine(nameatr); if (buf.at3.nam == nameatr) { Console.WriteLine("ВЕРНУЛА ПРАВДУ "); return(true); } else { return(false); } } else { return(false); } } else { return(false); } }
public bool is_last_atr_in_rule(string nameatr, int number) //если это последний операционный символ правила { DeltaQSigmaGammaSix1 rule = (DeltaQSigmaGammaSix1)this.DeltaList[number - 1]; if (rule.rightSix.Count > 0) { at_mag buf = findATop((string)(rule.rightSix[rule.rightSix.Count - 1])); if (buf != null) { if (buf.at3.nam == nameatr) { return(true); } else { return(false); } } else { return(false); } } else { return(false); } }
public bool Members_in_magazine(int number) //проверяет остались ли в магазине члены правила { DeltaQSigmaGammaSix1 delta = (DeltaQSigmaGammaSix1)this.DeltaList[number - 1]; if (this.Z.Count > 0) { if (delta.RightZ.Contains(((at_mag)this.Z.Peek()).name) && delta.RightZ.Count > 1) { return(true); } else { return(false); } } else { return(false); } }
public override bool Execute(string str) { DeltaQSigmaGammaSix1 delta = (DeltaQSigmaGammaSix1)this.DeltaList[0]; currState = this.Q0; if (this.Z.Count > 0) { this.Z.Pop(); } this.Z.Push(findATmag(delta.LeftZ)); ArrayList list = new ArrayList(); //выходная строка at_mag at = null; //буфер магазинного символа int i = 0; int j = 0; int y = 0; int ii = 0; //буфер для чисел char digit; Stack <int> deltanumbers = new Stack <int>(); //стек применяемых правил str = str + "e"; //empty step вставить "" не получается, так как это считается пустым символом, //который не отображается в строке string s; at = (at_mag)this.Z.Pop(); for (; ;) { Console.WriteLine(); foreach (at_mag item in this.Z) { Console.Write(" "); Console.Write(item.name); Console.Write("("); if (item.at1.val > -1) { Console.Write(item.at1.val.ToString()); } if (item.at2.val > -1) { Console.Write(","); Console.Write(item.at2.val.ToString()); } if (item.at3.val > -1) { Console.Write(","); Console.Write(item.at3.val.ToString()); } Console.Write(")"); } Console.WriteLine(); Console.Write("str[i]: "); Console.WriteLine(str[i]); Console.Write("at.name "); Console.Write(at.name); Console.Write("("); if (at.at1.val > -1) { Console.Write(at.at1.val.ToString()); } if (at.at2.val > -1) { Console.Write(","); Console.Write(at.at2.val.ToString()); } if (at.at3.val > -1) { Console.Write(","); Console.Write(at.at3.val.ToString()); } Console.WriteLine(")"); if (delta == null) // в вершине стека терминал { if (at.name.ToString() == "i" && (at.at1.nam != "") && ii > 0) //если символ входной строки == верхнему символу магазина { Console.WriteLine("в вершине стека Операционный символ i"); at.at1.val = ii; Console.Write("ВВЕРХ ПО i c "); Console.WriteLine(at.at1.val); //поиск куда нужно значение атрибутов выталкиваемого элемента whereAT(at.at1, deltanumbers, true); Console.WriteLine("ПОСЛЕ i"); list.Add(at); ii = 0; } else if (str[i].ToString() == at.name && at.at1.nam == "") { Console.WriteLine("в вершине стека Терминал"); i++; } else if (at.name == "i" && at.at1.nam == "") { digit = '0'; //i++; ii = 0; while (digit >= '0' && digit <= '9' && i <= str.Length) { ii = ii * 10 + digit - '0'; digit = str[i]; i++; } i--; if (ii > 0) { Console.WriteLine("в вершине стека Терминал i"); } } else if (this.Is_operation_symbol(at.name)) { Console.WriteLine("в вершине стека Операционный символ"); if (deltanumbers.Count > 0) { y = deltanumbers.Peek(); } foreach (var item in deltanumbers) { Console.Write(" "); Console.Write(item); } Console.WriteLine(); if (at.at1.val > -1) { whereAT(at.at1, deltanumbers, true); if (deltanumbers.Count > 0) { if (deltanumbers.Peek() != y) { deltanumbers.Push(y); } } } if (at.at2.val > -1) { whereAT(at.at2, deltanumbers, true); if (deltanumbers.Count > 0) { if (deltanumbers.Peek() != y) { deltanumbers.Push(y); } } } calculate_atr3(at); if (at.at3.val > -1) { whereAT(at.at3, deltanumbers, true); } //может нужно вставить значение еще и в лист (поменявшись с тем куда вставляли местами в порядке) // wherATlist(at, list); list.Add(at); } else { return(false); } } else if ((at.name == delta.LeftZ && delta.LeftTs.Contains(str[i].ToString()))) // в вершине стека Нетерминал { if (at.name == "Q") { if (deltanumbers.Count > 0) { if (deltanumbers.Peek() == 7 || deltanumbers.Peek() == 8) { deltanumbers.Pop(); } } } deltanumbers.Push(FindDeltaNumber(delta) + 1); foreach (var item in deltanumbers) { Console.Write(" "); Console.Write(item); } Console.WriteLine(); Console.WriteLine("в вершине стека Нетерминал"); s = arrToStr(delta.rightSix); for (j = s.Length - 1; j >= 0; j--) { if (findATop(s[j].ToString()) != null) { this.Z.Push(findATop(s[j].ToString())); } } s = arrToStr(delta.RightZ); /*if (s.Length == 0) * { * deltanumbers.Pop(); * } */ for (j = s.Length - 1; j >= 0; j--) { if (findATmag(s[j].ToString()) != null) { this.Z.Push(findATmag(s[j].ToString())); } } //поиск куда нужно значение атрибутов выталкиваемого элемента if (at.at1.val > -1) { whereAT(at.at1, deltanumbers, true); } if (at.at2.val > -1) { whereAT(at.at2, deltanumbers, true); } if (at.at3.val > -1) { whereAT(at.at3, deltanumbers, true); } } if (this.Z.Count != 0) { if (delta != null) { currState = arrToStr(delta.RightQ); } //at = (at_mag)Z.Peek(); at = (at_mag)this.Z.Pop(); delta = FindDelta(currState, at.name, str[i].ToString()); } else if (str[i].ToString() == "e") { Console.WriteLine("СТРОКА ВЫВОДА:"); foreach (at_mag atu in list) { Console.Write("{"); Console.Write(atu.name); Console.Write("}"); Console.Write("("); if (atu.at1.val > -1) { Console.Write(atu.at1.val.ToString()); } if (atu.at2.val > -1) { Console.Write(","); Console.Write(atu.at2.val.ToString()); } if (atu.at3.val > -1) { Console.Write(","); Console.Write(atu.at3.val.ToString()); } Console.Write(")"); } return(true); } else { return(false); } Console.WriteLine(); } }
public int FindDeltaNumber(DeltaQSigmaGammaSix1 delta) { return(this.DeltaList.IndexOf(delta)); }