Ejemplo n.º 1
0
Archivo: myMP.cs Proyecto: pagamov/4sem
        // МП для КС-грамматик
        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);
            }
        }
Ejemplo n.º 2
0
Archivo: myMP.cs Proyecto: pagamov/4sem
        } // 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
Ejemplo n.º 3
0
        public void debugDeltaRule(string step, DeltaQSigmaGamma d)
        {
//      Console.WriteLine(step + ": (" + d.leftNoTerm + " , " + d.leftTerm + " ) -> " + d.RightNoTerm);
        }