// МП для КС-грамматик public myMp(myGrammar KCgrammar) : base(new ArrayList() { "q" }, KCgrammar.T, new ArrayList() { }, "q") { this.Gamma = new ArrayList(); this.Z = new Stack(); foreach (string v1 in KCgrammar.V) // магазинные символы { Gamma.Add(v1); } foreach (string t1 in KCgrammar.T) { Gamma.Add(t1); } Q0 = Q[0].ToString(); // начальное состояние Z.Push(KCgrammar.S0); // начальный символ в магазине F = new ArrayList(); // пустое множество заключительных состояний DeltaQSigmaGamma delta = null; foreach (string v1 in KCgrammar.V) { // сопоставление правил с отображениями ArrayList q1 = new ArrayList(); ArrayList z1 = new ArrayList(); foreach (Prule rule in KCgrammar.Prules) { if (rule.leftNoTerm == v1) { Stack zb = new Stack(); ArrayList rr = new ArrayList(rule.rightChain); rr.Reverse(); foreach (string s in rr) { zb.Push(s); } z1.Add(zb); q1.Add(Q0); } } delta = new DeltaQSigmaGamma(Q0, "e", v1, q1, z1); DeltaList.Add(delta); } foreach (string t1 in KCgrammar.T) { Stack e = new Stack(); e.Push("e"); delta = new DeltaQSigmaGamma(Q0, t1, t1, new ArrayList() { Q0 }, new ArrayList() { e }); DeltaList.Add(delta); } }
} // end Execute_ public virtual bool Execute(string str) { //сразу нулевое правило брать DeltaQSigmaGamma delta = null; delta = (DeltaQSigmaGamma)this.DeltaList[0]; currState = this.Q0; int i = 0; int j = 0; str = str + "e"; // empty step вставить "" не получается, так как это считается пустым символом, //который не отображается в строке string s; delta.debug(); for (; ;) { if (delta == null) { return(false); } if (delta.LeftT != "") // И В ВЕРШИНЕ СТЕКА ТЕРМИНАЛЬНЫЙ СИМВОЛ LeftT!!!! пустой такт { for (; i < str.Length;) //модель считывающего устройства { if (Z.Peek().ToString() == str[i].ToString()) { this.Z.Pop(); currState = delta.RightQ.ToString(); i++; } else { return(false); } break; } } else if (delta.LeftT == "") // И В ВЕРШИНЕ СТЕКА НЕ ТЕРМИНАЛЬНЫЙ СИМВОЛ LeftT!!!! { //шаг 1 вытолкнуть из стека и занести в стек rightZ this.Z.Pop(); s = arrToStr(delta.RightZ); for (j = s.Length - 1; j >= 0; j--) { this.Z.Push(s[j]); } } if (this.Z.Count != 0) { currState = arrToStr(delta.RightQ); delta = findDelta(currState, Z.Peek().ToString()); delta.debug(); } else if (str[i].ToString() == "e") { return(true); } else { return(false); } } // end for //проверка на терминал или нетерминал в вершине стека //изменение правила по верхушке стека } // end Execute
public void debugDeltaRule(string step, DeltaQSigmaGamma d) { // Console.WriteLine(step + ": (" + d.leftNoTerm + " , " + d.leftTerm + " ) -> " + d.RightNoTerm); }