Esempio n. 1
0
        public  String interpret(String str)
        {
            String stdout = "";
            StringReader stdin = null;
            if(str!=null)
                stdin = new StringReader(str);
            int[] runtimeStack = new int[stackSize];
            Console.WriteLine("**Start Interpret the P_code**");
            int pc = 0, // pc:指令指针,
                bp = 0, //bp:指令基址,
                sp = 0;//sp:栈顶指针
            do
            {

                Pcode index = pcodeArray[pc++];// index :存放当前指令, 读当前指令
                //Console.WriteLine(pc + "  " + Pcode.pcode[index.f] + " " + index.l + " " + index.a);
                //Console.WriteLine(Pcode.pcode[index.f]);
                switch (index.f)
                {
                    case Pcode.LIT:                                                   // 将a的值取到栈顶
                        runtimeStack[sp++] = index.a;
                        break;
                    case Pcode.OPR:                                                   // 数学、逻辑运算
                        switch (index.a)
                        {
                            case 0:                                                          //OPR 0 0;RETURN 返回
                                sp = bp;
                                pc = runtimeStack[sp + 2];
                                bp = runtimeStack[sp + 1];
                                break;
                            case 1:                                                           //OPR 0 1 ;NEG取反
                                runtimeStack[sp - 1] = -runtimeStack[sp - 1];
                                break;
                            case 2:                                                           //OPR 0 2;ADD加法
                                sp--;
                                runtimeStack[sp - 1] += runtimeStack[sp];
                                
                                break;
                            case 3:                                                             //OPR 0 3;SUB减法
                                sp--;
                                runtimeStack[sp - 1] -= runtimeStack[sp];
                                
                                break;
                            case 4:                                                             //OPR 0 4;MUL乘法
                                sp--;
                                runtimeStack[sp - 1] = runtimeStack[sp - 1] * runtimeStack[sp];
                                
                                break;
                            case 5:                                                             //OPR 0 5;DIV除法
                                sp--;
                                runtimeStack[sp - 1] /= runtimeStack[sp];
                                
                                break;
                            case 6:                                                              //OPR 0 6;ODD对2取模mod 2
                                runtimeStack[sp - 1] %= 2;
                                break;
                            case 7:                                                              //OPR 0 7;MOD取模
                                sp--;
                                runtimeStack[sp - 1] %= runtimeStack[sp];
                                
                                break;
                            case 8:                                                             //OPR 0 8;==判断相等
                                sp--;
                                runtimeStack[sp - 1] = (runtimeStack[sp - 1] == runtimeStack[sp ] ? 1 : 0);
                                break;
                            case 9:                                                                //OPR 0 9;!=判断不相等
                                sp--;
                                runtimeStack[sp - 1] = (runtimeStack[sp - 1] != runtimeStack[sp] ? 1 : 0);
                                break;
                            case 10:                                                               //OPR 0 10;<判断小于
                                sp--;
                                runtimeStack[sp - 1] = (runtimeStack[sp - 1] < runtimeStack[sp] ? 1 : 0);
                                break;
                            case 11:                                                                //OPR 0 11;>=判断大于等于
                                sp--;
                                runtimeStack[sp - 1] = (runtimeStack[sp - 1] >= runtimeStack[sp] ? 1 : 0);
                                break;
                            case 12:                                                                //OPG 0 12;>判断大于
                                sp--;
                                runtimeStack[sp - 1] = (runtimeStack[sp-1] > runtimeStack[sp ] ? 1 : 0);
                                break;
                            case 13:                                                                 //OPG 0 13;<=判断小于等于
                                sp--;
                                runtimeStack[sp - 1] = (runtimeStack[sp - 1] <= runtimeStack[sp ] ? 1 : 0);
                                
                                break;
                            case 14:                                                                 //OPG 0 14;输出栈顶值
                                Console.WriteLine("runtimeStack[sp - 1]" + runtimeStack[sp - 1] + ' ');
                                try
                                {
                                    stdout += " " + runtimeStack[sp - 1] + ' ';
                                    //stdout.Flush();
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("***case 14 meet with error***");
                                }
                                sp--;
                                break;
                            case 15:                                                                 //OPG 0 15;输出换行
                                Console.WriteLine("\n");
                                try
                                {
                                    stdout += ("\n");
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("***case 15 meet with error***");
                                }
                                break;
                            case 16:                                                                 //OPG 0 16;读入一行输入,置入栈顶
                                Console.WriteLine("Please Input a Integer : ");
                                runtimeStack[sp] = 0;
                                try
                                {
                                    runtimeStack[sp] = Int32.Parse(stdin.ReadLine().Trim());       //读入一个整型数字
                                    Console.WriteLine(runtimeStack[sp]);
                                    sp++;
                                }
                                catch (Exception e)
                                {
                                    //e.printStackTrace();
                                    Console.WriteLine("***read data meet with error***");
                                }
                                
                                break;
                        }
                        break;
                    case Pcode.LOD:                                          //取相对当前过程的数据基地址为a的内存的值到栈顶
                        runtimeStack[sp] = runtimeStack[Base(index.l, bp) + index.a];
                        sp++;
                        break;
                    case Pcode.STO:                                         //栈顶的值存到相对当前的过程的数据基地址为a的内存
                        sp--;
                        runtimeStack[Base(index.l,  bp) + index.a] = runtimeStack[sp];
                        break;
                    case Pcode.CAL:                                                                 //调用子程序
                        runtimeStack[sp] = Base(index.l,  bp);            //将静态作用域基地址入栈
                        runtimeStack[sp + 1] = bp;                                                //将动态作用域基地址
                        runtimeStack[sp + 2] = pc;                                               //将当前指针入栈
                        bp = sp;                                                                        //改变基地址指针值为新过程的基地址
                        pc = index.a;                                                                 //跳转至地址a
                        break;
                    case Pcode.INT:                                                               //开辟空间大小为a
                        sp += index.a;
                        break;
                    case Pcode.JMP:                                                               //直接跳转至a
                        pc = index.a;
                        break;
                    case Pcode.JPC:
                        sp--;
                        if (runtimeStack[sp] == 0) //条件跳转至a(当栈顶指针为0时)
                        {
                            pc = index.a;
                        }
                        break;
                }
            } while (pc != 0);
           
            return stdout;
        }