form1.cs

来自「实现了此法分析器和语法分析器 有详细的代码和文档」· CS 代码 · 共 2,012 行 · 第 1/5 页

CS
2,012
字号
            for (u = 0; u < 16; u++)
                for (v = 0; v < 2; v++)
                {
                    string n_Data = n_SR.ReadLine();
                    strArray2[u, v] = n_Data;
                }
            n_SR.Close();
        }
        private void Form1_Load_1(object sender, EventArgs e)
        {
            initiate();
        }
//语法分析器(递归下降)-----------------------------------------------------------------------------------------------------------------------------------

        public string sym, sym1;
        public int i1 = -1;
        public int i2=0,i4=0;//变量/过程数组指针
        public int i3 = -1;
        public int pi;//存过程名在数组中的位置
        public int pv;//过程中第一个变/参数在变量名表中的位置
        public int vf=-1;//过程中有无变量的标志
        public int countv = 0;//某一过程中参数+变量总个数
        public int countpar = 0;//某一过程中参数个数
        public string str3 = "";
        public string sss = "";
        public int acc = 0;
        public int pd = 0;//过程计数器
        public int bbb = 0;//填过程名表标志
        public int cc = 0;//主过程与子过程的区别
        public string[,] strArray3 = new string[100, 3];//变量名表
        public string[,] strArray4 = new string[100, 6];//过程名表(第五列为过程调用结束时的号码)

        /// <summary>
        /// stringArray1存的词法分析分析出来的结果
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>


        private void button3_Click(object sender, EventArgs e)
        {
            initilize1();//使用变量i1,i2,i4
            initilize2(); //给张凯用
            getword();
            PROG();//主程序开始
            richTextBox3.Text = str3;
            outtable();
            OUT4();//输出四元式
        }
        public void getword()//从二元式文件读一个单词
        {
            i1 = i1 + 1;
            sym=strArray1[i1,1];
        }
        public void PROG()//主程序开始和结尾
        {
            if (sym == "1")//program
            {
                str3 = strArray1[i1, 0];
                getword();
                if (sym == "17")//标识符
                {
                    pi = i1;//暂存过程名
                    str3 = str3 + " " + strArray1[i1, 0];
                    getword();
                    if (sym == "33")//“;”
                    {
                        str3 = str3 + strArray1[i1, 0];
                        getword();
                        if (sym == "35")//Enter
                        {
                            str3 = str3 + "\n";
                            getword();
                            i3 = 0;//变量在主程序层
                            PP();//调<过程>
                            GEN(9, -1, -1, -1, -1, -1, -1);//停机
                            if (sym == "34")//结束符“.”
                            {
                                str3 = str3 + strArray1[i1, 0];
                            }
                            else
                            {
                                error1(4);
                                skip();
                            }
                        }
                        else
                        {
                            error1(3);
                            skip();
                        }
                    }
                    else
                    {
                        error1(2);
                        skip();
                    }
                }
                else
                {
                    error1(1);
                    skip();
                }
            }
            else
            {
                error1(0);
                skip();
            }
        }
        public void PP()//过程
        {
            if (sym == "2")//var
            {
                vf = 1;//过程中有变量的标志设为1
                str3 = str3 + strArray1[i1, 0];
                IDP();
            }
            while (sym == "3")//procedure,规定没有procedure的嵌套,循环判断是不是过程
            {
                vf = 0;
                countv = 0;
                countpar = 0;
                cc = 1;
                pv = -1;//当过程无参数无变量时,在变量名表中的位置为-1
                str3 = str3 + strArray1[i1, 0];
                pd = pd + 1;
                pc = pd * 100;
                PRP();
            }
            if (sym == "4")//begin
            {
                if (vf == 0)
                {
                    if (cc == 1)//子程序的begin
                    {
                        enterp(pi, countpar, countv, pv);//填过程名表
                        GEN(8, -1, -1, i4, -1, -1, -3);//子过程申请空间
                        bbb = 1;
                    }
                }
                if (cc == 0)//是主程序的begin
                {
                    GEN(22, -1, -1, -1, -1, -1, -1);//主程序开始的产生式
                    backpatch(0, 2);
                }
                str3 = str3 + strArray1[i1, 0] + "\n";
                PL();//调用张凯的接口
                if (sym == "5")//end
                {
                    str3 = str3 + strArray1[i1, 0];
                    vf = -1;
                    getword();
                }
                else
                    error1(6);
            }
            else
            {
                error1(5);
                error1(6);
            } 
        }
        public void PRP()//子程序开始和结尾
        {
            getword();
            if (sym == "17")
            {
                pi = i1;//每次getword都加1
                str3 = str3 + " " + strArray1[i1, 0];
                getword();
                if (sym == "30")//“(”
                {
                    str3 = str3 + strArray1[i1, 0];
                    getword();
                    i3 = 1;//变量在子过程中
                    PART();//处理参数
                }
                if (sym == "33")//“;”
                {
                    str3 = str3 + strArray1[i1, 0];
                    getword();
                    if (sym == "35")//Enter
                    {
                        str3 = str3 + "\n";
                        getword();
                        i3 = 1;//变量在子过程中
                        PP();
                        GEN(7, -1, -1, -1, -1, -1, -1);//返回,范一鹏调用
                        //pc = pc - 1;//回到前一条四元式号
                        //strArray4[i4 - 1, 5] = pc.ToString();//记录call调用结束后无条件跳转的号码
                        //pc = pc + 1;//还原
                        if (sym == "33")//;
                        {
                            str3 = str3 + strArray1[i1, 0];
                            vf = -1;
                            pc = 0;
                            cc = 0;
                            getword();
                            if (sym == "35")//Enter
                            {
                                str3 = str3 + "\n";
                                getword();
                            }
                            else
                                error1(3);
                        }
                        else
                            error1(2);
                    }
                    else
                        error1(3);
                }
                else
                    error1(2);
            }
            else
                error1(1); 
        }
        public void IDP()//识别变量
        {
            getword();
            while (sym == "17")
            {
                countv = countv + 1;//变量的相对数,变量名表的第3列
                if (countv == 1)
                    pv = i2;
                enterv(i1,countv);//填表
                str3 = str3 + " " + strArray1[i1, 0];
                getword();
                if (sym == "32")//“,”
                {
                    str3 = str3 + strArray1[i1, 0];
                    getword();
                    if (sym == "35")
                    {
                        error1(8);
                    }
                }
                else if (sym == "33")//“;”
                {
                    str3 = str3 + strArray1[i1, 0];
                    getword();
                    if (sym == "35")
                    {
                        str3 = str3 + "\n";
                        getword();
                    }
                    else
                        error1(3);
                }
                else
                    error1(2);
            }
            if (cc == 1)//是子过程
            {
                enterp(pi, countpar, countv, pv);//填过程名表
                GEN(8, -1, -1, i4, -1, -1, -3);//
                bbb = 1;
            }
            else//是主过程
            {
                enterp(pi, countpar, countv, pv);//填过程名表
                strArray4[i4, 4] = "1";
                i4 = i4 + 1;
            }
            i3 = -1;//回原始态
        }
        public void PART()//识别参数
        {
            countpar = 0;
            while (sym == "17")
            {
                countpar = countpar + 1;
                countv = countv + 1;
                if (countv == 1)
                    pv = i2;
                enterv(i1, countpar);
                str3 = str3 + " " + strArray1[i1, 0];
                getword();
                if (sym == "32")//“,”
                {
                    str3 = str3 + strArray1[i1, 0];
                    getword();
                    if (sym == "35")
                    {
                        error1(8);
                    }
                }
                else if (sym == "31")//“)”
                {
                    str3 = str3 + strArray1[i1, 0];
                    getword();
                }
            }
        }
        public void PL()//可执行语句
        {
            int i;
            getword();
            PASERSTACK[0,0] = 0;
            acc = 0;//
            while (acc!=999)
            {
                if (sym == "35")
                {
                    getword();
                }
                else
                {
                    if (PASERSTACK[SP,0] == 1 && sym == "5")
                    {
                        acc = 999;
                    }
                    else
                    {
                        lookupaction(sym);
                        if (n3 == 0)
                        {
                            getword();
                        }
                        for (i = 0; i <= SP; i++)//显示栈的情况
                        {
                            sss = sss + PASERSTACK[i,0].ToString()+" ";
                            if (i == SP)
                                sss = sss + "\n";
                        } 
                    }
                    
                }
                
            }
            richTextBox6.Text = richTextBox6.Text+sss;
            SP = 0;//为下一次分析做准备
        }
        public void enterp(int k0,int k1,int k2,int k3)//填过程名表
        {
            strArray4[i4, 0] = strArray1[k0, 0];//过程名
            strArray4[i4, 1] = k1.ToString(); ;//过程的参数个数
            strArray4[i4, 2] = k2.ToString();//过程的变量个数+参数个数
            strArray4[i4, 3] = k3.ToString();//过程的第一个变量(或参数)在变量名表的位置
        }
        public int lookupp()//查过程名表,范一鹏查表
        {
            int i;
            for (i = 0; i <= i4-1; i++)
            {
                if (strArray4[i, 0] == strArray1[i1, 0])//过程名表的字符==当前读入字符
                {
                    break;
                }
            }
            return i;
        }
        public void enterv(int k,int k1)//填变量名表,k是当前读词法分析表数组的下标,getword一次,加1,k1是过程参数/变量的相对个数
        {
            strArray3[i2, 0] = strArray1[k, 0];//变量名
            if (i3 == 0)
            {
                strArray3[i2, 1] = "0";//主过程变量
            }
            if (i3 == 1)
            {
                strArray3[i2, 1] = "1";//过程变量
            }
            strArray3[i2, 2] = k1.ToString();//变量相对数
            i2 = i2 + 1;
        }
        public int lookupv()//查变量名表
        {
            int i;
            for (i = 0; i <= i2-1; i++)
            {
                if (strArray3[i, 0] == strArray1[i1, 0])//变量名表的字符==当前读入字符
                    {
                        break;
                    }
            }
            return i;
        }
        public void skip()//跳过若干个单词
        {
          while(sym!="2" & sym!="3" & sym!="4")
              getword();
          PP();
        }
        public void error1(int e)//错误处理
        {
          if (e==0)
              MessageBox.Show("缺少program");
          else if (e==1)
              MessageBox.Show("缺少标识符");
          else if (e == 2)
              MessageBox.Show("缺少;");
          else if (e == 3)
              MessageBox.Show("缺少Enter");
          else if (e == 4)
              MessageBox.Show("缺少.");
          else if (e == 5)
              MessageBox.Show("缺少begin");
          else if (e == 6)
              MessageBox.Show("缺少end");
          else if (e == 7)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?