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

📄 main.cs

📁 C语言来构造编译器的,十分详细的源代码
💻 CS
📖 第 1 页 / 共 5 页
字号:
                                }
                                xiayige();//下一个
                            }
                            shuchui(3); shuchus("endif ");//输出接口的基本块划分
                        }
                        else if (searchelse() == 1)//有else的情况 即为if then else endif
                        {
                            //textBox1.Text = searchelse().ToString();//测试用
                            yuxianpd = researchelse();//进行出口的判断
                            linshi_int2 = hangshu + yuxianpd+2;//计算出口
                            tiaozhuans(linshi_int2);//输出无条件天转的四元式
                            while (now != 2)//else 当now不为else的时候执行
                            {

                                if (now == 17) //=
                                {
                                    fuzhis(); //赋值计算
                                }
                                xiayige();//下一个
                            }
                            xiayige();
                            shuchui(2); shuchus("else ");//输出接口的基本块划分
                            yuxianpd = researchif();//进行出口的判断
                            linshi_int2 = hangshu + yuxianpd + 1;//计算出口
                            tiaozhuans(linshi_int2);//输出无条件天转的四元式
                            while (now != 3)//endif  当now不为endif的时候执行
                            {

                                if (now == 17) //=
                                {
                                    fuzhis(); //赋值计算
                                }
                                xiayige();//下一个
                            }
                            shuchui(3); shuchus("endif ");//输出接口的基本块划分
                        }
                        else return "error";


                    }
                    return "succeed";//返回
            }
            listBox1.Items.Add("错误 !");
            return "error";//返回
        }
        //以下是while循环部分
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public string whiles()//while的功能【完成】
            {
                shuchui(6); shuchus("while ");//输出接口的基本块划分
                xiayige(); xiayige();//下两个是bool式子的第一个id
                switch (now)//判断now
                {

                    case 32://如果是id(只可能是id)
                        xiayige();//下一个
                        linshi_int1 = hangshu;//先记录现在的行数然后在读到endwhile的时候产生一个无条件的跳转
                        if (now == 18 || now == 19 || now == 20 || now == 21 || now == 22 || now == 23) { bools(); }//判断产生bool式的条件
                        else { listBox1.Items.Add("错误 !while 后面应跟bool表达式"); break; }//如果不是bool式报错
                        //tiaozhuans(hangshu);//测试用
                        xiayige();//下一个取do
                        shuchui(7); shuchus("do ");//输出接口的基本块划分
                        if(now==7)//do
                        {
                            yuxianpd = research();//进行出口的判断
                            linshi_int2 = hangshu + yuxianpd + 2;//计算出口
                            tiaozhuans(linshi_int2);//输出无条件天转的四元式
                            while (now != 8)//endwhile  当now不为endwhile的时候执行
                            {
                                
                                if (now == 17) //=
                                {
                                    fuzhis(); //赋值计算
                                    //tiaozhuans(hangshu);//测试用
                                }
                                xiayige();//下一个
                            }
                        }
                        if (now == 8) { tiaozhuans(linshi_int1); }//最后一个无条件跳转指向第一句
                        shuchui(8); shuchus("endwhile ");//输出接口的基本块划分
                        //tiaozhuans(hangshu);//测试用
                        //richTextBox3.Find("L5");//测试用


                        return "succeed";//返回
                }
                listBox1.Items.Add("错误 !");
                return "error";//返回
            }
        //以下是判断部分
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public string bools()//bool判断的功能【完成】
            {
                shangyige();//当检测到=的时候,向前一个,由于赋值式的等号左边不能为多项式,所以直接赋出口
                switch (now)//检测now
                {
                    case 32://id的情况
                        {
                            siyuanshi[1] = shuru_s[tip];//取id1
                            xiayige();//下一个元素
                            siyuanshi[0] = shuru_s[tip];//取符号
                            xiayige(); //下一个元素
                            siyuanshi3[1] = siyuanshi[1];//存放于临时变量
                            siyuanshi3[0] = siyuanshi[0];//存放于临时变量
                            siyuanshi[2] = bools_fuzhu();//计算等号后面的式子的四元式
                        {
                            linshi_int = hangshu + 2;//跳转的行数=之中的四元式的行数+两个无条件jump
                            linshi = shuchu_hangshu(linshi_int);//产生行数
                            siyuanshi[3] = linshi;//加入四元式
                        }
                            siyuanshi[0] = siyuanshi3[0];//从临时变量中取出
                            siyuanshi[1] = siyuanshi3[1];//从临时变量中取出
                            printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
                        }
                        return "Error";//错误提示
                }
                return "Error";//错误提示
            }
        public string bools_fuzhu()//bool函数的辅助函数【完成】//计算等号后面的式子的四元式
        {
            while (now != 26)//当now的值不为;的时候
            {
                //textBox2.Text = shuru_s[tip];//测试用
                if (now == 32)//当是简单赋值的情况
                {
                    xiayige();//下一个
                    if (now == 26) { shangyige(); return shuru_s[tip]; }//检测是不是;如果是直接返回

                }
                if (now == 30)//当是常整数的时候执行
                {
                    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 fuzhis()//赋值的功能【完成】
            {
                shangyige();//当检测到=的时候,向前一个,由于赋值式的等号左边不能为多项式,所以直接赋出口
                switch (now)//检测now
                {
                    case 32://id的情况
                        {
                            siyuanshi[3] = shuru_s[tip];//取出口
                            //textBox3.Text = shuru_s[tip];
                            xiayige();//下一个元素
                            siyuanshi[0] = shuru_s[tip];//取符号
                            //textBox2.Text = shuru_s[tip];
                            xiayige(); //下一个元素
                            siyuanshi3[3] = siyuanshi[3];//存放于临时变量
                            siyuanshi3[0] = siyuanshi[0];//存放于临时变量
                            //textBox1.Text = shuru_s[tip];//测试用
                            siyuanshi[1] = fuzhis_fuzhu();//计算等号后面的式子的四元式
                            siyuanshi[2] = "_";//id2 必定为空
                            siyuanshi[0] = siyuanshi3[0];//从临时变量中取出
                            siyuanshi[3] = siyuanshi3[3];//从临时变量中取出
                            printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
                        }
                        return "Error";//错误提示
                }
                return "Error";//错误提示
            }
        public string fuzhis_fuzhu()//赋值函数的辅助函数【完成】//计算等号后面的式子的四元式
        {
            //textBox3.Text = shuru_s[tip];
            while (now != 26)//当now的值不为;的时候
            {
                //textBox2.Text = shuru_s[tip];//测试用
                if (now == 32)//当是简单赋值的情况
                {
                    xiayige();//下一个
                    if (now == 26) { shangyige(); return shuru_s[tip]; }//检测是不是;如果是直接返回

                }
                if(now==30)//当是常整数的时候执行

⌨️ 快捷键说明

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