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);
            }
        }
Example #2
0
        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 at_mag findATmag(string nam)  //найти для вставки в магазин символ с нужным названием и вычислить значения его атрибутов, если возможно
 {
     foreach (at_mag s in this.Gamma) //транслятору передавали список магазинных символов
     {
         if (s.name == nam)
         {
             at_mag r = new at_mag(s.name, s.at1.nam, s.at2.nam, s.at3.nam);
             return(r);
         }
     }
     return(null);
 }
 public void calculate_atr3(at_mag op) //вычислить значение третьего атрибута операционного символа
 {
     if (op.name == "+" && op.at1.val > -1 && op.at2.val > -1)
     {
         op.at3.val = op.at1.val + op.at2.val;
     }
     else if (op.name == "-" && op.at1.val > -1 && op.at2.val > -1)
     {
         op.at3.val = op.at1.val - op.at2.val;
     }
     else if (op.name == "*" && op.at1.val > -1 && op.at2.val > -1)
     {
         op.at3.val = op.at1.val * op.at2.val;
     }
     else if (op.name == "/" && op.at1.val > -1 && op.at2.val > -1)
     {
         op.at3.val = op.at1.val / op.at2.val;
     }
 }
        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 bool setATval(string name, int value, Stack <int> deltanumbers, int y)
        {
            int    pos   = 0;
            bool   is_op = false;
            string Vname = null; // имя нетерминала с этим атрибутом

            foreach (at_mag at in this.Gamma)
            {
                if (at.at1.nam == name || at.at2.nam == name || at.at3.nam == name)
                {
                    Vname = at.name;
                    break;
                }
            }
            if (Vname == null)
            {
                foreach (at_mag at in this.operation_symbols)
                {
                    if (at.at1.nam == name || at.at2.nam == name || at.at3.nam == name)
                    {
                        Vname = at.name;
                        is_op = true;
                        break;
                    }
                }
                if (Vname == null)
                {
                    return(false);
                }
            }
            Console.Write("Found Vname: ");
            Console.WriteLine(Vname);
            at_mag dop = new at_mag("");
            Stack  d   = new Stack(); //буфер
            int    i   = 1;

            foreach (at_mag at in this.Z)
            {
                pos++;
                if (at.name == Vname)
                {
                    Console.Write("Found in Z: ");
                    Console.Write(Vname);
                    Console.Write(" pos: ");
                    Console.WriteLine(pos);
                    if (at.at1.nam == name && at.at1.val == -1)
                    {
                        at.at1.val = value;
                        if (is_op == true) //если так присвоила значение операционному символу
                        {
                            dop = (at_mag)this.Z.Pop();
                            while (i < pos)
                            {
                                i++;
                                d.Push(dop);
                                dop = (at_mag)this.Z.Pop();
                            }

                            while (this.Z.Count > 0)
                            {
                                dop = (at_mag)this.Z.Pop();
                                d.Push(dop);
                                while (Is_operation_symbol(dop.name) && this.Z.Count > 0)
                                {
                                    if (dop.at3.val == -1)
                                    {
                                        break;
                                    }
                                    dop = (at_mag)this.Z.Pop();
                                    d.Push(dop);
                                }
                            }
                            this.Z.Push(at);
                            foreach (at_mag f in d)
                            {
                                this.Z.Push(f);
                            }
                        }
                        Console.Write("ПРИСВОИЛА ЗНАЧЕНИЕ: ");
                        Console.WriteLine(value);
                        return(true);
                    }
                    else if (at.at2.nam == name && at.at2.val == -1)
                    {
                        at.at2.val = value;
                        if (is_op == true) //если так присвоила значение операционному символу
                        {
                            dop = (at_mag)this.Z.Pop();
                            while (i < pos)
                            {
                                i++;
                                d.Push(dop);
                                dop = (at_mag)this.Z.Pop();
                            }
                            while (this.Z.Count > 0)
                            {
                                dop = (at_mag)this.Z.Pop();
                                d.Push(dop);
                                while (Is_operation_symbol(dop.name) && this.Z.Count > 0)
                                {
                                    if (dop.at3.val == -1)
                                    {
                                        break;
                                    }
                                    dop = (at_mag)this.Z.Pop();
                                    d.Push(dop);
                                }
                            }
                            this.Z.Push(at);
                            foreach (at_mag f in d)
                            {
                                this.Z.Push(f);
                            }
                        }
                        Console.Write("ПРИСВОИЛА ЗНАЧЕНИЕ: ");
                        Console.WriteLine(value);
                        calculate_atr3(at);
                        if (at.at3.val > -1)
                        {
                            deltanumbers.Push(y);
                            whereAT(at.at3, deltanumbers, true);
                        }
                        return(true);
                    }
                    else if (at.at3.nam == name && at.at3.val == -1)
                    {
                        at.at3.val = value;
                        if (is_op == true) //если так присвоила значение операционному символу
                        {
                            dop = (at_mag)this.Z.Pop();
                            while (i < pos)
                            {
                                i++;
                                d.Push(dop);
                                dop = (at_mag)this.Z.Pop();
                            }
                            while (this.Z.Count > 0)
                            {
                                dop = (at_mag)this.Z.Pop();
                                d.Push(dop);
                                while (Is_operation_symbol(dop.name) && this.Z.Count > 0)
                                {
                                    if (dop.at3.val == -1)
                                    {
                                        break;
                                    }
                                    dop = (at_mag)this.Z.Pop();
                                    d.Push(dop);
                                }
                            }
                            this.Z.Push(at);
                            foreach (at_mag f in d)
                            {
                                this.Z.Push(f);
                            }
                        }
                        Console.Write("ПРИСВОИЛА ЗНАЧЕНИЕ: ");
                        Console.WriteLine(value);
                        return(true);
                    }
                }
            }
            return(false);
        }