// 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); } }
public bool Execute_(string str) { string currState = this.Q0; DeltaQSigmaGamma delta = null; int i = 0; str = str + "e"; for (; ;) // empty step { delta = findDelta(currState, str[i].ToString()); if (delta == null) { return(false); } if (delta.leftT != "e") { for (; i < str.Length;) { this.Q = delta.rightQ; currState = arrToStr(delta.rightQ); if (delta.leftZ == Z.Peek().ToString() && delta.rightZ[0].ToString() == "e") { this.Z.Pop(); } else { this.Z.Push(delta.leftT); } i++; break; } } else if (delta.leftT == "e") { this.Q = delta.rightQ; this.Z.Pop(); if (this.Z.Count == 0) { return(true); } else { return(false); } } } // end for } // end Execute_