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; }