Ejemplo n.º 1
0
        void polizWhile(Node[] masTableLexAnalysis) 
        {
            try
            {
                List listA = new List();
                Stack listM = new Stack();

                for (int i = g; g < masTableLexAnalysis.Length; g++)
                {
                    string word = getWord(masTableLexAnalysis[g]);

                    if (word == "do")
                    {
                        listA.add(Convert.ToString(countWordPoliz + 1));
                        polizLogTerm(masTableLexAnalysis, g + 2);

                        m++;
                        listM.push("M" + m);
                        resultsPolizString += "M" + m + " !F ";
                        countWordPoliz+=2;

                        g++;
                        whatOperatorForPoliz(masTableLexAnalysis);

                        
                        m++;
                        listM.push("M" + m);
                        resultsPolizString += "M" + m + " ! ";
                        countWordPoliz += 2;
                        listA.add(Convert.ToString(countWordPoliz + 1));
                    }
                    else
                        if (word == "loop")
                        {
                            g++;
                            break;
                        }
                }
                LabelList.add(listM.pop(), listA.pop());
                LabelList.add(listM.pop(), listA.pop());
            }
            catch { errorsTextBox.Text = "Возникла неизвестная ошибка при выполнении перевода в полиз"; }
        }
Ejemplo n.º 2
0
       void TranslateToGenarationCode() 
        {
            try
            {
                int coutntString = 1;//Количество строк в генерации
                int adr = 500;
                string[] poliz = resultsPolizString.Split(' ', '\n');
                Stack stack = new Stack();
                
                Node[] masLabel = LabelList.getData();

                for (int i = 0; i < poliz.Length; i++)
                {
                    
                    string s = poliz[i];
                    
                    if (s == "")
                        continue;
                    else
                        if (isDigit(s))
                        {
                            stack.push(s, 0);
                        }
                        else
                            if (isId(s))
                            {
                               stack.push(s, adr);
                                adr++;
                            }
                            else
                                if (isArifSign(s)) //арифметическая операция
                                {
                                    NodeGen b = stack.popGen();
                                    NodeGen a = stack.popGen();

                                    if (isId(a.value))
                                    {
                                        adr--;
                                        generationBox.AppendText(coutntString+") "+"RD " + a.adr + "\n");
                                        coutntString++;
                                    }
                                    else if (isDigit(a.value))
                                    {
                                        generationBox.AppendText(coutntString + ") " + "RD #" + a.value + "\n");
                                        coutntString++;
                                    }

                                    if (isId(b.value))
                                    {
                                        adr--;
                                        switch (s)
                                        {
                                            case ("-"): generationBox.AppendText(coutntString + ") " + "SUB " + b.adr + "\n"); break;
                                            case ("+"): generationBox.AppendText(coutntString + ") " + "ADD " + b.adr + "\n"); break;
                                            case ("*"): generationBox.AppendText(coutntString + ") " + "MUL " + b.adr + "\n"); break;
                                            case ("/"): generationBox.AppendText(coutntString + ") " + "DIV " + b.adr + "\n"); break;
                                        }
                                        coutntString++;
                                    }
                                    else if (isDigit(b.value))
                                    {
                                        switch (s)
                                        {
                                            case ("-"): generationBox.AppendText(coutntString + ") " + "SUB #" + b.value + "\n"); break;
                                            case ("+"): generationBox.AppendText(coutntString + ") " + "ADD #" + b.value + "\n"); break;
                                            case ("*"): generationBox.AppendText(coutntString + ") " + "MUL #" + b.value + "\n"); break;
                                            case ("/"): generationBox.AppendText(coutntString + ") " + "DIV #" + b.value + "\n"); break;
                                        }
                                        coutntString++;
                                    }
                                    generationBox.AppendText(coutntString + ") " + "WR 700 \n");
                                    coutntString++;
                                }

                                else
                                    if (s == ":=")
                                    {
                                        generationBox.AppendText(coutntString + ") " + "RD 700 \n");
                                        coutntString++;
                                        generationBox.AppendText(coutntString + ") " + "WR " + stack.popGen().adr + "\n");
                                        coutntString++;
                                    }
                                    else
                                        if (isLogSing(s))//смотрим знак
                                        {
                                            NodeGen b = stack.popGen();
                                            NodeGen a = stack.popGen();

                                            if (isId(a.value))
                                            {
                                                adr--;
                                                generationBox.AppendText(coutntString + ") " + "RD " + a.adr + "\n");
                                                coutntString++;
                                            }
                                            else
                                                if (isDigit(a.value))
                                                {
                                                    generationBox.AppendText(coutntString + ") " + "RD #" + a.value + "\n");
                                                    coutntString++;
                                                }
                                            if (isId(b.value))
                                            {
                                                adr--;
                                                generationBox.AppendText(coutntString + ") " + "SUB " + b.adr + "\n");
                                                coutntString++;
                                                switch (s)
                                                {
                                                    case ">": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                    case "<": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                    case "!=": generationBox.AppendText(coutntString + ") " + "JZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                    case "==": generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                    case ">=": 
                                                               generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n");
                                                               coutntString++;
                                                               generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n");
                                                               i += 2;
                                                        break;
                                                    case "<=":
                                                                generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n");
                                                                coutntString++;
                                                                generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n");
                                                                i += 2;
                                                        break;
                                                }
                                                coutntString++;

                                            }
                                            else
                                                if (isDigit(b.value))
                                                {
                                                    generationBox.AppendText(coutntString + ") " + "SUB #" + b.value + "\n");
                                                    switch (s)
                                                    {
                                                        case ">": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                        case "<": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                        case "!=": generationBox.AppendText(coutntString + ") " + "JZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                        case "==": generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break;
                                                        case ">=": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n");
                                                                   coutntString++;
                                                                   generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); 
                                                                   i += 2;
                                                                   break;
                                                        case "<=": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n");
                                                                   coutntString++;
                                                                   generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); 
                                                                    i += 2;
                                                                    break;
                                                    }
                                                    coutntString++;
                                                }
                                        }
                                        else
                                            if (s == "!")
                                            {
                                                generationBox.AppendText(coutntString + ") " + "JMP " + getAdr(poliz[i - 1], masLabel) + "\n");
                                                coutntString++;
                                            }
                                            
                                                else
                                                    if (s == "READ")
                                                    {
                                                        generationBox.AppendText(coutntString + ") " + "WR " + stack.popGen().adr + "\n");
                                                        coutntString++;
                                                        for (int j = 1; j < Convert.ToInt16(poliz[i + 1]); j++)
                                                        {
                                                            generationBox.AppendText(coutntString + ") " + "WR " + stack.popGen().adr + "\n");
                                                            coutntString++;
                                                        }
                                                        i++;
                                                    }
                                                    else
                                                        if (s == "WRITE")
                                                        {
                                                            generationBox.AppendText(coutntString + ") " + "RD 700 \n");
                                                            coutntString++;
                                                        }
                                                        else if (s == "end")
                                                        {
                                                            generationBox.AppendText(coutntString + ") " + "HLT");
                                                            coutntString++;
                                                        }




                }
                
            } 
            catch
            {
                errorsTextBox.Text = "Возникла неизвестная ошибка при генерации кода.";
            }
        }
Ejemplo n.º 3
0
        void polizFor(Node[] masTableLexAnalysis)
        {
            try
            {

                List listA = new List();
                Stack listM = new Stack();

                string id = getWord(masTableLexAnalysis[g + 1]);

                for (int i = g; g < masTableLexAnalysis.Length; g++)
                {
                    string word = getWord(masTableLexAnalysis[g]);

                    if (word == "for")
                    {
                        g++;
                        polizAssigned(masTableLexAnalysis);
                    }
                    else
                        if (word == "to")
                        {
                            listA.add(Convert.ToString(countWordPoliz + 1));
                            g++;
                            polizArifTerm(masTableLexAnalysis);
                            m++;

                            listM.push("M" + m);
                            resultsPolizString += "M" + m + " !F ";
                            countWordPoliz += 2;
                        }
                        else
                            if (word == "do")
                            {
                                g++;
                                whatOperatorForPoliz(masTableLexAnalysis);
                                m++;

                                resultsPolizString += id + " " + id + " " + "1 + := " + "M" + m + " ! ";
                                countWordPoliz += 7;
                                listM.push("M" + m);
                            }
                            else
                                if (word == ";")
                                    break;
                }
                listA.add(Convert.ToString(countWordPoliz));
                LabelList.add(listM.pop(), listA.pop());
                LabelList.add(listM.pop(), listA.pop());

            }
            catch { errorsTextBox.Text = "Возникла неизвестная ошибка при выполнении перевода в полиз"; }
        }