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

📄 execute_2.cpp

📁 Win32 Console下C++实现的PL/0语言编译程序
💻 CPP
字号:
#include "compiler.h"

extern INSTRUCTION codelist[];

int sp,ip,bx;
int stack[EXESTACKSIZ]={0};
int run(enum instruction f, int l, int a);

int execute(){
	int tip;
	ip = bx = 0;
	do{
		tip = ip ++;
		run(codelist[tip].f,codelist[tip].l,codelist[tip].a);
	}while(ip>0);
	printf("\nProgram end normally!\n");
	return 0;
}

int pushn(int n){
	sp += n;
	if(sp >= EXESTACKSIZ){
		PRT_REPORT(RUN_STACK_OVERFLOW);
		return TMNT;
	}
	return sp;
}
int popn(int n){
	sp -= n;
	return sp;
}
int push(int data){
	stack[sp++] = data;
	if(sp == EXESTACKSIZ){
		PRT_REPORT(RUN_STACK_OVERFLOW);
		return TMNT;
	}
	return 0;
}
int pop(){
	sp --;
	return stack[sp];
}
int getbx(int l,int b){
	int bx = b;
	if(l == 0)
		return b;
	while(l>0){
		l+=stack[bx];
		bx = stack[bx+1];
		//l += satck[bx];
		l--;
	}
	return bx;
}
int run(enum instruction f, int l, int a){
	int t;
	switch(f){
	case LIT:
		push(a);
		break;
	case LOD:
		t = getbx(l,bx)+a;
		push(stack[t]);
		break;
	case STO:
		t = getbx(l,bx)+a;
		stack[t] = pop();
		break;
	case CAL:
		push(l);
		push(bx);
		push(ip);
		pop();
		pop();
		pop();
		bx = sp;
		ip = a;
		break;
	case INT:
		pushn(a);
		break;
	case JMP:
		ip = a;
		break;
	case JPC:
		if(!pop()){
			ip = a;
		}
		break;
	case OPR:
		switch(a){
		case 0:
			ip = pop();
			bx = pop();
			pop();
			break;
		case 1:
			stack[sp-1] = -stack[sp-1];
			break;
		case 2:
			stack[sp-2] += stack[sp-1];
			pop();
			break;
		case 3:
			stack[sp-2] -= stack[sp-1];
			pop();
			break;
		case 4:
			stack[sp-2] *= stack[sp-1];
			pop();
			break;
		case 5:
			stack[sp-2] /= stack[sp-1];
			pop();
			break;
		case 6:
			stack[sp-1] %= 2;
			break;
		case 8:
			stack[sp-2] = (stack[sp-2]==stack[sp-1]);
			pop();
			break;
		case 9:
			stack[sp-2] = (stack[sp-2]!=stack[sp-1]);
			pop();
			break;
		case 10:
			stack[sp-2] = (stack[sp-2]<stack[sp-1]);
			pop();
			break;
		case 11:
			stack[sp-2] = (stack[sp-2]<=stack[sp-1]);
			pop();
			break;
		case 12:
			stack[sp-2] = (stack[sp-2]>stack[sp-1]);
			pop();
			break;
		case 13:
			stack[sp-2] = (stack[sp-2]>=stack[sp-1]);
			pop();
			break;
		case 14:
			printf("%d",pop());
			break;
		case 15:
			printf("\n");
			break;
		case 16:
			push(0);
			scanf("%d",&stack[sp-1]);
			break;
		}
		break;
	}
	return 0;
}

⌨️ 快捷键说明

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