예제 #1
0
        //

        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);
            }
        }
예제 #2
0
        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_