⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cs

📁 C语言来构造编译器的,十分详细的源代码
💻 CS
📖 第 1 页 / 共 5 页
字号:
                                        //textBox1.Text = siyuanshi[2]; textBox2.Text = huancun.ToString();//检测用
                                        siyuanshi[0] = siyuanshi1[0];//取符号
                                        siyuanshi[1] = siyuanshi1[1];//t  取第一个变量
                                        siyuanshi[3] = huacunpd();//返回出口
                                        printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
                                        
                                        return huacunpdcuan();//返回
                                    }
                                    else//此处的else为无连乘的情况,形如t+a,t+t等
                                    {
                                        shangyige();//向前一个到第一个变量
                                        if (now == 13 || now == 14 || now == 15 || now == 16)//在此判断指针是否指向了最后的一个字符(一般这种情况不会发生,但是以防万一)
                                        { xiayige(); }//如果指针指向了最后的字符,向前移动一个位置保证读入的是id
                                        siyuanshi[0] = siyuanshi1[0];//取符号
                                        siyuanshi[1] = siyuanshi1[1]; //由于前面的siyuanshi[1] 值为id 而不是t,所以在此重新赋值
                                        siyuanshi[2] = shuru_s[tip]; siyuanshi[3] = huacunpd();//为四元式的第二个变量和出口赋值
                                        printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
                                        return huacunpdcuan();//返回
                                    }

                                }
                                else//此处的else为前面无连乘也无乘除的情况,形如a+b,a+t
                         {
                                siyuanshi[0] = shuru_s[tip];//四元式的符号赋值
                                shangyige();//取第一个变量
                                siyuanshi[1] = shuru_s[tip];//四元式的第一个值赋值 
                                xiayige();//返回op
                                xiayige();//取第二个变量
                                siyuanshi2[0] = siyuanshi[0]; //由于加法和乘法的优先级关系,所以在遇到后面有乘法的时候,需要先计算后面乘法的四元式,然后再计算前面加法的四元式
                                siyuanshi2[1] = siyuanshi[1]; //此处由于后面的chenchu()会将siyuanhsi[]中的内容替换,所以使用siyuanshi1[]进行暂时的存储
                                    //textBox1.Text = siyuanshi1[1].ToString();//检测用
                                xiayige();//下两个符号,可能是 ; 或 乘除 或 +- 或 ) 之一
                                if (now == 15 || now == 16)// 后面的符号为乘除的情况  形如a*t
                                {

                                    siyuanshi[2] = chenchus();// 先计算后面的乘除(此处为嵌套)
                                    //textBox1.Text = siyuanshi[2]; textBox2.Text = huancun.ToString();// 检测用
                                    siyuanshi[0] = siyuanshi2[0];//取符号
                                    siyuanshi[1] = siyuanshi2[1];// 取第一个变量
                                    siyuanshi[3] = huacunpd();//返回出口
                                    printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
                                    
                                    return huacunpdcuan();//返回
                               }
                               else//此处的else为前面无连乘也无乘除的情况,形如a+b
                                {
                                    shangyige();//取第一个变量
                                    if (now == 13 || now == 14 || now == 15 || now == 16)//在此判断指针是否指向了最后的一个字符(一般这种情况不会发生,但是以防万一)
                                    { xiayige(); }//如果指针指向了最后的字符,向前移动一个位置保证读入的是id
                                    siyuanshi[0] = siyuanshi2[0];//取符号
                                    siyuanshi[1] = siyuanshi2[1]; //由于前面的siyuanshi[1] 值为id 而不是t,所以在此重新赋值
                                    siyuanshi[2] = shuru_s[tip]; siyuanshi[3] = huacunpd();//为四元式的第二个变量和出口赋值
                                    printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
                                    return huacunpdcuan(); //返回
                                }

                                        

                        }
                    


            }
            return "error";

        }
        public string chenchus()//乘除 的功能【完成】
        {
            shangyige();//前一个id1
            switch (now)//判断now的值从而得到shuru[]中的值
            {
                case 25://待扩展
                    return "此处作为待扩展部分";
                case 30://整常数
                    {
                        siyuanshi[1] = shuru_s[tip];//取第一个id
                        xiayige();//取下一元素
                        siyuanshi[0] = shuru_s[tip];//取符号
                        xiayige();//取下一元素

                        {
                            siyuanshi[2] = shuru_s[tip]; siyuanshi[3] = huacunpd(); //取第三个id以及出口(由于括弧不参与计算,所以乘除的优先级最高)
                            printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]); //进行具体的输出
                            chen_chu = true;//由于进行的乘除的计算,所以置标识为true
                            {
                                xiayige();//向下
                                if (now == 13 || now == 14) { jiajians(); }//后面有加减法的情况
                                shangyige();//向上
                            }
                            lianchenpd();//调用连乘判断的函数进行判断
                            return huacunpdcuan();//返回
                        }


                    }
                case 32://id
                    {
                        siyuanshi[1] = shuru_s[tip];//取第一个id
                        xiayige();//取下一元素
                        siyuanshi[0] = shuru_s[tip];//取符号
                        xiayige();//取下一元素

                        {
                            siyuanshi[2] = shuru_s[tip]; siyuanshi[3] = huacunpd(); //取第三个id以及出口(由于括弧不参与计算,所以乘除的优先级最高)
                            printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]); //进行具体的输出
                            chen_chu = true;//由于进行的乘除的计算,所以置标识为true
                            {
                                xiayige();//向下
                                if (now == 13 || now == 14) { jiajians(); }//后面有加减法的情况
                                else shangyige();//向上
                            }
                            lianchenpd();//调用连乘判断的函数进行判断


                            return huacunpdcuan();//返回
                        }


                    }




            }
            return "error";//返回错误
        }
        //以下的部分两个加起来完成连乘的功能
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public string lianchen() //连乘的功能,与lianchenpd()函数一起完成形如 a+b*c*d*e*...*z 的运算式【完成】
        {

            siyuanshi[1] = huacunpdcuan(); siyuanshi[0] = shuru_s[tip];//取第一个id和op
            xiayige(); siyuanshi[2] = shuru_s[tip]; siyuanshi[3] = huacunpd();//取第二个id和出口
            printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//输出
            lian_chen = true;//将lianchen()的状态符设为true
            return huacunpdcuan();//返回
            
        }
        public string lianchenpd()//进行是否需要连乘的判断,与lianchen()函数一起完成形如 a+b*c*d*e*...*z 的运算式【完成】
        {
            xiayige();//下一个
            while (now == 15 || now == 16)//如果指向的符号是乘除的话说明需要连乘
            {
                lianchen();//进行连乘的计算
                lianchenpd();//再次判断(嵌套)
            }
            //if (now == 26) { return ""; } if (now == 25) { return ""; }//测试用
            return huacunpdcuan();//返回

        
        }
        //以下的部分为数组操纵的设置
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public int scan()//按字符读取源文件【完成】
            {
                now = shuru[tip];//获得当前数组
                return tip;//返回数组tip
            }
        public void getnext()//获取下一个编号【完成】
            {
                tip++;//将数组号加一

            }
        public void getforward()//获取上一个编号【完成】
            {
                tip--;//将数组号减一

            }
        public string xiayige()//判断是否可以取下一个元素并且使数组加一//下一个【完成】
        {
            if (tip < shuru.Length - 1)//判断tip的值在最大值以内
            { getnext(); scan(); return "succeed"; }//向下一个元素,并且读取,返回succeed(其中返回的succeed为检测使用,不会显示)
            else { return "error"; }//如果超出范围返回error
        }
        public string shangyige()//判断是否可以取上一个元素并且使数组减一//上一个【完成】
        {
            if (tip >= 0)//判断tip的值在最大值以内
            { getforward(); scan(); return "succeed"; }//向上一个元素,并且读取,返回succeed(其中返回的succeed为检测使用,不会显示)
            else { return "error"; }//超出范围返回error
        }
        //以下的部分为缓存部分
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public string huacunpd()//缓存判断(加一)【完成】
        {
            if (huancun == 0) { huancun++; return "t0"; }//如果缓存的数值为0时返回t0并且将缓存的值设为一,下同
            else if (huancun == 1) { huancun++; return "t1"; }
            else if (huancun == 2) { huancun++; return "t2"; }
            else if (huancun == 3) { huancun++; return "t3"; }
            else if (huancun == 4) { huancun++; return "t4"; }
            else if (huancun == 5) { huancun++; return "t5"; }
            else if (huancun == 6) { huancun++; return "t6"; }
            else if (huancun == 7) { huancun++; return "t7"; }
            else if (huancun == 8) { huancun++; return "t8"; }
            else if (huancun == 9) { huancun++; return "t9"; }
            else if (huancun == 10) { huancun++; return "t10"; }
            else if (huancun == 11) { huancun++; return "t11"; }
            else if (huancun == 12) { huancun++; return "t12"; }
            else if (huancun == 13) { huancun++; return "t13"; }
            else if (huancun == 14) { huancun++; return "t14"; }
            else if (huancun == 15) { huancun++; return "t15"; }
            else if (huancun == 16) { huancun++; return "t16"; }
            else if (huancun == 17) { huancun++; return "t17"; }

⌨️ 快捷键说明

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