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

📄 main.cs

📁 C语言来构造编译器的,十分详细的源代码
💻 CS
📖 第 1 页 / 共 5 页
字号:
                {
                    return shuru_s[tip];//返回常整数的值 
                }
                if (now == 27)//当是字符常数的时候执行
                {
                    xiayige();//跳过‘
                    linshi = "'" + shuru_s[tip] + " '";//输出字符常数
                    xiayige();//跳过’
                    return linshi;
                }
                if (now == 15 || now == 16)//如果是乘除的话执行
                {
                    //textBox1.Text =" eeee";
                    chenchus();//调用chechu()
                    return huacunpdcuan();//测试用
                }
                if (now == 13 || now == 14)//如果是加减的话执行
                {
                    jiajians();//调用jiajian()
                    //textBox1.Text = huacunpdcuan();//检测用
                    return huacunpdcuan();//测试用
                }

                xiayige();//下一个运算符
                
                
            }
            return "error";
            //return huacunpdcuan();//返回
        
        }
        //由于多项式的计算只涉及加减乘除的运算而不涉及括号的先后优先级在此作为简化但是留下括弧的扩展接口待扩展
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public string jiajians()//加减 的功能【完成】
        {
            shangyige();//前一个id1
            switch (now)
            {
                case 25:
                    return "此处作为待扩展部分";
                case 30:
                    {
                        xiayige();//op使指针指向运算符 
                        //////////////////////////////////////连乘的情况
                        if (lian_chen == true)//如果在前面已经有了连乘的计算,适用于t+a(且t为连乘)
                        {
                            lian_chen = false;//将连乘的状态清除,防止下一次再进入这个状态形成错误
                            siyuanshi[1] = huacunpdcuan();//在连乘的情况下将t赋给第一个变量
                            siyuanshi[0] = shuru_s[tip];//取符号op
                            xiayige(); xiayige();//下两个符号,可能是 ; 或 乘除 或 +- 或 ) 之一
                            siyuanshi4[0] = siyuanshi[0];//由于加法和乘法的优先级关系,所以在遇到后面有乘法的时候,需要先计算后面乘法的四元式,然后再计算前面加法的四元式
                            siyuanshi4[1] = siyuanshi[1];//t  此处由于后面的chenchu()会将siyuanhsi[]中的内容替换,所以使用siyuanshi1[]进行暂时的存储
                            if (now == 15 || now == 16)// 后面的符号为乘除的情况  形如a+b*t
                            {

                                siyuanshi[2] = chenchus();//先计算后面的乘除(此处为嵌套)
                                //textBox1.Text = siyuanshi[2]; textBox2.Text = huancun.ToString();//检测用
                                siyuanshi[0] = siyuanshi4[0];//取符号
                                siyuanshi[1] = siyuanshi4[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] = siyuanshi4[0];//取符号
                                siyuanshi[1] = siyuanshi4[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 if (chen_chu == true)//在前面或者后面有乘法运算的时候,形如t+t,a+t等
                        {
                            chen_chu = false;//将乘除的状态清除防止出现下一次再进入的错误
                            siyuanshi[1] = huacunpdcuan();//t  此处的第一个变量指代的是chechu()的函数所返回的t
                            siyuanshi[0] = shuru_s[tip];//取符号
                            xiayige(); xiayige();//下两个符号,可能是 ; 或 乘除 或 +- 或 ) 之一
                            siyuanshi1[0] = siyuanshi[0];//由于加法和乘法的优先级关系,所以在遇到后面有乘法的时候,需要先计算后面乘法的四元式,然后再计算前面加法的四元式
                            siyuanshi1[1] = siyuanshi[1];//t  此处由于后面的chenchu()会将siyuanhsi[]中的内容替换,所以使用siyuanshi1[]进行暂时的存储
                            if (now == 15 || now == 16)// 后面的符号为乘除的情况  形如a+b*t
                            {

                                siyuanshi[2] = chenchus();//先计算后面的乘除(此处为嵌套)
                                //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(); //返回
                            }



                        }
                       
                            
                    }
                case 32://与30相同

                                xiayige();//op使指针指向运算符 
                                //////////////////////////////////连乘的情况
                                if (lian_chen == true)//如果在前面已经有了连乘的计算,适用于t+a(且t为连乘)
                                {
                                    lian_chen = false;//将连乘的状态清除,防止下一次再进入这个状态形成错误
                                    siyuanshi[1] = huacunpdcuan();//在连乘的情况下将t赋给第一个变量
                                    siyuanshi[0] = shuru_s[tip];//取符号op
                                    xiayige(); xiayige();//下两个符号,可能是 ; 或 乘除 或 +- 或 ) 之一
                                    siyuanshi4[0] = siyuanshi[0];//由于加法和乘法的优先级关系,所以在遇到后面有乘法的时候,需要先计算后面乘法的四元式,然后再计算前面加法的四元式
                                    siyuanshi4[1] = siyuanshi[1];//t  此处由于后面的chenchu()会将siyuanhsi[]中的内容替换,所以使用siyuanshi1[]进行暂时的存储
                                    if (now == 15 || now == 16)// 后面的符号为乘除的情况  形如a+b*t
                                    {

                                        siyuanshi[2] = chenchus();//先计算后面的乘除(此处为嵌套)
                                        //textBox1.Text = siyuanshi[2]; textBox2.Text = huancun.ToString();//检测用
                                        siyuanshi[0] = siyuanshi4[0];//取符号
                                        siyuanshi[1] = siyuanshi4[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] = siyuanshi4[0];//取符号
                                        siyuanshi[1] = siyuanshi4[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 if (chen_chu == true)//在前面或者后面有乘法运算的时候,形如t+t,a+t等
                                {
                                    chen_chu = false;//将乘除的状态清除防止出现下一次再进入的错误
                                    siyuanshi[1] = huacunpdcuan();//t  此处的第一个变量指代的是chechu()的函数所返回的t
                                    siyuanshi[0] = shuru_s[tip];//取符号
                                    xiayige(); xiayige();//下两个符号,可能是 ; 或 乘除 或 +- 或 ) 之一
                                    siyuanshi1[0] = siyuanshi[0];//由于加法和乘法的优先级关系,所以在遇到后面有乘法的时候,需要先计算后面乘法的四元式,然后再计算前面加法的四元式
                                    siyuanshi1[1] = siyuanshi[1];//t  此处由于后面的chenchu()会将siyuanhsi[]中的内容替换,所以使用siyuanshi1[]进行暂时的存储
                                    if (now == 15 || now == 16)// 后面的符号为乘除的情况  形如a+b*t
                                    {

                                        siyuanshi[2] = chenchus();//先计算后面的乘除(此处为嵌套)

⌨️ 快捷键说明

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