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

📄 plxcompile.cs

📁 编译器
💻 CS
📖 第 1 页 / 共 3 页
字号:
                    error("call 语句无法识别!");
                }

            }
            else
            {
                /* 空语句 */
            }
        }

        // or/xor表达式语句 
        void be()
        {
            bt();

            while (sym == orsym || sym == xorsym)
            {
                if (sym == orsym)
                {
                    getsym();
                    bt();

                    gen(fct.OPR, 0, 14);
                }
                else
                {
                    getsym();
                    bt();

                    gen(fct.OPR, 0, 19);
                }
            }
        }
        

        //数学整形表达式
        void ae()
        {
            int addop = -1;

            if (sym == minus)
            {
                addop = sym;
                getsym();
                at();

                gen(fct.OPR, 0, 1);
            }
            else
            {
                at();
            }

            while (sym == minus || sym == plus)
            {
                addop = sym;
                getsym();
                at();

                if (addop == plus)
                {
                    gen(fct.OPR, 0, 2);
                }
                else
                {
                    gen(fct.OPR, 0, 3);
                }
            }
        }

        //数学乘除求余表达式 
        void at()
        {
            af();

            int mulop = -1;

            while (sym == times || sym == slash || sym == remainder || sym == cifang)
            {
                mulop = sym;
                getsym();
                af();

                if (mulop == times)
                {
                    gen(fct.OPR, 0, 4);

                }
                else if (mulop == slash)
                {
                    gen(fct.OPR, 0, 5);
                }
                else if (mulop == remainder)
                {
                    gen(fct.OPR, 0, 17);
                }
                else
                {
                    gen(fct.OPR, 0, 18);
                }
            }
        }

        //and 布尔表达式 
        void bt()
        {
            bf();

            while (sym == andsym)
            {
                getsym();
                bf();

                gen(fct.OPR, 0, 15);
            }
        }

        //表达式因子 
        void af()
        {
            if (sym == ident)
            {
                int index = position(id);

                if (index == 0)
                {
                    error("'%s' 没有定义!");
                }
                else
                {
                    int kind = (int)table[index].kind;

                    if (kind == (int)vartype.varInteger)
                    {
                        gen(fct.LOD, lev - table[index].level, table[index].adr);
                        getsym();

                    }
                    else if (kind == (int)vartype.varConst)
                    {
                        gen(fct.LIT, 0, table[index].val);
                        getsym();

                    }
                    else
                    {
                        //error("'%s' 运算式中不可使用!", id);
                    }
                }
            }
            else
            {
                if (sym == lparen)
                {
                    getsym();

                    ae();

                    if (sym == rparen)
                    {
                        getsym();
                    }
                    else
                    {
                        error("缺乏')'标识符!");
                    }
                }
                else if (sym == number)
                {
                    gen(fct.LIT, 0, num);
                    getsym();

                }
                else
                {
                    error("不可识别的运算因子!");
                }
            }
        }

        //布尔表达式  
        void bf()
        {
            if (sym == ident)
            {
                int index = position(id);

                if (index == 0)
                {
                    error("'%s' 标识符未定义!");

                }
                else
                {
                    if (table[index].kind == vartype.varLogical)
                    {
                        gen(fct.LOD, lev - table[index].level, table[index].adr);
                        getsym();
                    }
                    else
                    {
                        re();
                    }
                }

            }
            else if (sym == truesym)
            {
                getsym();
                gen(fct.LIT, 0, 1);

            }
            else if (sym == falsesym)
            {
                getsym();
                gen(fct.LIT, 0, 0);

            }
            else if (sym == notsym)
            {
                getsym();
                bf();

                gen(fct.OPR, 0, 16);

            }
            else if (sym == lparen)
            {
                getsym();

                be();

                if (sym == rparen)
                {
                    getsym();

                }
                else
                {
                    error("运算式缺少 ')' 标识符!");
                }

            }
            else
            {
                re();
            }
        }

        //比较运算表达式
        void re()
        {
            ae();

            switch (sym)
            {
                case eql: getsym();
                    ae();
                    gen(fct.OPR, 0, 8);
                    break;
                case gtr: getsym();
                    ae();
                    gen(fct.OPR, 0, 12);
                    break;
                case lss: getsym();
                    ae();
                    gen(fct.OPR, 0, 10);
                    break;
                case geq: getsym();
                    ae();
                    gen(fct.OPR, 0, 11);
                    break;
                case leq: getsym();
                    ae();
                    gen(fct.OPR, 0, 13);
                    break;
                case neql: getsym();
                    ae();
                    gen(fct.OPR, 0, 9);
                    break;
                default: error("错误的运算符号!"); break;
            }
        }

        // 中间码结构 
        public enum instruction :int{OPR, LIT, LOD, STO, INT, JMP, JPC, SHO, CAL };
        public enum fct : int { OPR, LIT, LOD, STO, INT, JMP, JPC, SHO, CAL };

        public struct CODE
        {
            public fct f;
            public int l;
            public int a;
            public int line;
        };

        //存储代码的数组和指标 
        CODE[] code;
        int cx;
        public string codeSource;
        public string result;

        ///生成代码        
        void gen(fct _f, int _l, int _a)
        {
            if (cx < MAX_CODENUMBER)
            {
                code[cx].f = _f;
                code[cx].l = _l;
                code[cx].a = _a;
                code[cx].line = lineIndex;

                cx++;

            }
            else
            {
                error("程序长度溢出!");
            }
        }

        /*  虚拟机  */
        int[] s;                       /*  运行栈           */
        int t;                          /*  运行栈指针       */
        CODE i;                          /*  指令寄存器       */
        int p;                          /*  PC寄存器         */
        int b;                          /*  基地址寄存器     */

        // 虚拟机 */
        public void interpret()
        {
            t = 0;
            b = 1;
            p = 0;

            s[1] = 0;
            s[2] = 0;
            s[3] = 0;

            do
            {
                i = code[p];
                p++;

                switch (i.f)
                {
                    case fct.LIT: t++;
                        s[t] = i.a;
                        break;
                    case fct.OPR: switch (i.a)
                        {
                            case 0: t = b - 1;
                                p = s[t + 3];
                                b = s[t + 2];
                                break;
                            //负数
                            case 1: s[t] = -s[t];
                                break;
                            case 2: t--;//加法
                                s[t] = s[t] + s[t + 1];
                                break;
                            case 3: t--;//减法
                                s[t] = s[t] - s[t + 1];
                                break;
                            case 4: t--;//乘法
                                s[t] = s[t] * s[t + 1];
                                break;
                            case 5: t--;//除法
                                s[t] = s[t] / s[t + 1];
                                break;
                            case 17: t--;//求余
                                while (s[t] >= s[t + 1])
                                {
                                    s[t] = s[t] - s[t + 1];
                                }
                                break;
                            case 6: break;
                            case 7: break;
                            case 8: t--;//等于
                                s[t] = s[t] == s[t + 1] ? 1 : 0;
                                break;
                            case 9: t--;//不等于
                                s[t] = s[t] != s[t + 1] ? 1 : 0;
                                break;
                            case 10: t--;//小于
                                s[t] = s[t] < s[t + 1] ? 1 : 0;
                                break;
                            case 11: t--;//大于等于
                                s[t] = s[t] >= s[t + 1] ? 1 : 0;
                                break;
                            case 12: t--;//大于
                                s[t] = s[t] > s[t + 1] ? 1 : 0;
                                break;
                            case 13: t--;//小于等于
                                s[t] = s[t] <= s[t + 1] ? 1 : 0;
                                break;
                            case 14: t--;//或运算
                                s[t] = ((s[t]==1) || (s[t + 1]==1))? 1:0;
                                break;
                            case 19: t--;//异或
                                s[t] = (s[t] == s[t + 1]) ? 1 : 0; break;
                            case 15: t--;//与运算
                                s[t] = ((s[t] == 1) && (s[t + 1] == 1)) ? 1 : 0;
                                break;
                            //非运算
                            case 16: s[t] = (s[t] == 1) ? 0 : 1;
                                break;
                            case 18: t--;//乘方
                                int tempt = s[t + 1];
                                int num = s[t];
                                while (tempt > 1)
                                {
                                    s[t] = s[t] * num;
                                    tempt--;
                                }
                                break;
                        
                        }
                        break;
                    case fct.LOD: t++;
                        s[t] = s[based(i.l) + i.a];
                        break;
                    case fct.STO: s[based(i.l) + i.a] = s[t];
                        t--;
                        break;
                    case fct.CAL: s[t + 1] = based(i.l);
                        s[t + 2] = b;
                        s[t + 3] = p;
                        b = t + 1;
                        p = i.a;
                        break;
                    case fct.INT: t = t + i.a;
                        break;
                    case fct.JMP: p = i.a;
                        break;
                    case fct.JPC: if (s[t] == 0)
                        {
                            p = i.a;
                        }
                        t--;
                        break;
                    case fct.SHO: 
                        result += s[t] + "\r\n";
                        t--;
                        break;
                    default: break;
                }

            } while (p != 0);
        }

        //计算静态链地址 
        int based(int l)
        {
            int b1 = b;
            int l1 = l;

            while (l1 > 0)
            {
                b1 = s[b1];
                l1 = l1 - 1;
            }

            return b1;
        }

        // 清空重新初始化 
        void clear()
        {
            cc = 0;
            ll = 0;
            lineIndex = 1;
            tx = 0;
            cx = 0;
            dx = 0;
            lev = 0;

            errornum = 0;
        }

        // 屏幕上显示中间码 
        public void showCode()
        {
            string[] word = {"OPR",
		               "LIT",
					   "LOD",
					   "STO",
					   "INT",
					   "JMP",
					   "JPC",
					   "SHO",
					   "CAL"};

            
            codeSource = "CODE: \r\n";
            for (int i = 0; i < cx; i++)
            {  
                codeSource += i + ","+ word[(int)code[i].f]+","+code[i].l+","+code[i].a+"\r\n";
            }
        }

        //开始编译     
        public void Compiler()
        {
            clear();

            getch();
            getsym();

            
            //Console.WriteLine("Compiling......");
            Prog();
            FileClose();
            result = "";
           // Console.WriteLine("Succeed");
        }

    }

}


⌨️ 快捷键说明

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