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

📄 lrsemanticor.cpp

📁 1.1 引言 1.1.1 设计目的 本次课程设计是在完成一个学期的编译原理课程之后
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	case 3: return true;
	case 4: return true;
	case 5:
		value=signCache[2];			//取ident
		num=searchVTable(value);	//查变量表
		if(num==-1)					//变量未定义
		{
			enterVTable(1);
			return false;
		}
		temp3.name=value;			//该变量为目的操作数
		temp3.offset=VariableTable.table[num].relposition;
		temp3.rlevel=level-VariableTable.table[num].plevel;
		temp3.type=0;
		temp1=place.top();			//取第一操作数
		place.pop();
		temp2.type=-1;				//第二操作数不使用
		GEN(5,temp1,temp2,temp3);	//四元式:赋值
		return true;
	case 6:
	case 7:
		BACKPATCH(chain.top(),PC);		//回填
		chain.pop();
		return true;
	case 8:
	case 9:
		temp3.type=1;
		temp3.name=NULL;
		temp3.offset=chain.top();
		temp3.rlevel=0;
		temp1.type=temp2.type=-1;
		GEN(11,temp1,temp2,temp3);
		BACKPATCH(chain.top(),PC);
		chain.pop();
		return true;
	case 10:
		value=signCache[3];			//取过程名
		num=CHECK(value);			//检查过程调用是否合理	
		if(num==-1) return false;	
		temp1.type=temp2.type=-1;
		while(part.size()!=0)
		{
			temp3=part.front();
			part.pop();
			GEN(10,temp1,temp2,temp3);
		}
		temp1.type=1;					//常数
		temp1.offset=level-ProcTable.table[num].plevel;	//常数值:相对层差
		temp3.type=1;					//常数
		temp3.offset=ProcTable.table[num].quaterposition;	//常数值:该过程四元式首址
		GEN(6,temp1,temp2,temp3);
		return true;
	case 11:
		value=signCache[0];				//取过程名
		num=CHECK(value);				//检查过程调用是否合理	
		if(num==-1) return false;
		temp2.type=-1;
		temp1.type=1;					//常数
		temp1.offset=level-ProcTable.table[num].plevel;	//常数值:相对层差
		temp3.type=1;					//常数
		temp3.offset=ProcTable.table[num].quaterposition;	//常数值:该过程四元式首址
		GEN(6,temp1,temp2,temp3);
		return true;
	case 12:
		temp1.type=temp2.type=-1;
		while(part.size()!=0)
		{
			temp3=part.front();
			part.pop();
			GEN(18,temp1,temp2,temp3);
		}
		return true;
	case 13:
		temp1.type=temp2.type=-1;
		while(part.size()!=0)
		{
			temp3=part.front();
			part.pop();
			GEN(20,temp1,temp2,temp3);
		}
		return true;
	case 14: return true;
	case 15:
		BACKPATCH(chain.top(),PC+1);
		chain.pop();
		chain.push(PC);
		temp1.type=temp2.type=temp3.type=-1;
		GEN(11,temp1,temp2,temp3);
		return true;
	case 16: return true;
	case 17: return true;
	case 18:
		temp2=place.top();
		place.pop();
		temp3=place.top();
		place.pop();
		temp1=place.top();
		place.pop();
		place.push(temp3);
		temp3.type=-1;				//暂不使用,等待回填
		chain.push(PC);
		GEN(17,temp1,temp2,temp3);
		temp2=place.top();
		place.pop();
		GEN(1,temp1,temp2,temp1);
		return true;
	case 19: return true;
	case 20:
		value=signCache[2];			//取ident
		num=searchVTable(value);
		if(num==-1) return false;	//变量未定义
		temp3.name=value;
		temp3.offset=VariableTable.table[num].relposition;
		temp3.rlevel=level-VariableTable.table[num].plevel;
		temp3.type=0;
		temp1=place.top();			//取第一操作数
		place.pop();
		temp2.type=-1;				//第二操作数不使用
		GEN(5,temp1,temp2,temp3);	//四元式:赋值
		place.push(temp3);
		return true;
	case 21:
	case 22:
		temp1=place.top();
		place.pop();
		part.push(temp1);
		return true;
	case 23: return true;
	case 24: return true;
	case 25: return true;
	case 26:
		value=signCache[0];				//取变量名
		num=searchVTable(value);		//查变量表
		if(num==-1) return false;		//变量未定义
		temp1.name=value;
		temp1.offset=VariableTable.table[num].relposition;
		temp1.rlevel=level-VariableTable.table[num].plevel;
		temp1.type=0;
		part.push(temp1);
		return true;
	case 27:  return true;
	case 28:
	case 29:
	case 30:
	case 31:
		temp2=place.top();				//取第二操作数
		place.pop();
		temp1=place.top();				//取第一操作数
		place.pop();
		K++;							//申请临时变量
		temp3.type=2;					//临时变量
		if(K<10)						//0-9号临时变量
		{
			value=(char*)malloc(3*sizeof(char));
			c[0]=K+48;
			c[1]='\0';
			strcpy(value,"T");
			strcat(value,c);
		}
		else 
			if(K<100)			//10-99号临时变量
			{
				int i,j;
				value=(char*)malloc(4*sizeof(char));
				i=K/10;
				j=K-10*i;
				strcpy(value,"T");
				c[0]=i+48;
				c[1]=j+48;
				c[2]='\0';
				strcat(value,c);
			}
			else
				if(K<1000)		//100-999号临时变量
				{
					int i,j,l;
					value=(char*)malloc(5*sizeof(char));
					i=K/100;
					j=(K-100*i)/10;
					l=K-100*i-10*j;
					strcpy(value,"T");
					c[0]=i+48;
					c[1]=j+48;
					c[2]=l+48;
					c[3]='\0';
					strcat(value,c);
				}
		temp3.name=value;
		temp3.offset=K;
		temp3.rlevel=0;
		place.push(temp3);							//临时变量入栈
		GEN(productor-27,temp1,temp2,temp3);		//生成相应的四元式
		return true;
	case 32:
		temp1=place.top();				//取第一操作数
		place.pop();
		temp2.type=-1;					//第二操作数不使用
		K++;							//申请临时变量
		temp3.type=2;					//临时变量
		if(K<10)						//0-9号临时变量
		{
			value=(char*)malloc(3*sizeof(char));
			c[0]=K+48;
			c[1]='\0';
			strcpy(value,"T");
			strcat(value,c);
		}
		else 
			if(K<100)			//10-99号临时变量
			{
				int i,j;
				value=(char*)malloc(4*sizeof(char));
				i=K/10;
				j=K-10*i;
				strcpy(value,"T");
				c[0]=i+48;
				c[1]=j+48;
				c[2]='\0';
				strcat(value,c);
			}
			else
				if(K<1000)		//100-999号临时变量
				{
					int i,j,l;
					value=(char*)malloc(5*sizeof(char));
					i=K/100;
					j=(K-100*i)/10;
					l=K-100*i-10*j;
					strcpy(value,"T");
					c[0]=i+48;
					c[1]=j+48;
					c[2]=l+48;
					c[3]='\0';
					strcat(value,c);
				}
		temp3.name=value;
		temp3.offset=K;
		temp3.rlevel=0;
		place.push(temp3);				//临时变量入栈
		GEN(0,temp1,temp2,temp3);		//生成相应的四元式
		return true;
	case 33: return true;
	case 34:
		value=signCache[0];				//取变量名
		num=searchVTable(value);		//查变量表
		if(num==-1) return false;		//变量未定义
		temp1.name=value;
		temp1.offset=VariableTable.table[num].relposition;
		temp1.rlevel=level-VariableTable.table[num].plevel;
		temp1.type=0;
		place.push(temp1);				//操作数入栈
		return true;
	case 35:
		int mid;						//存放转换中的整形数
		mid=0;
		temp1.type=1;					//常数:type=1
		value=signCache[0];				//取“常数串”
		while((*value)!='\0')			//将常数串转换成整形
		{
			mid=10*mid+(*value)-48;
			value++;
		}
		temp1.offset=mid;				//常数:offset=常数值
		place.push(temp1);				//操作数入栈
		return true;
	case 36:
		int jump;
		chain.push(PC);					//建立回填链
		temp2=place.top();				//取第二操作数
		place.pop();
		temp1=place.top();				//取第一操作数
		place.pop();
		jump=quad.top();				//取比较运算符
		quad.pop();
		temp3.type=-1;					//目的操作数:暂时不用,等待回填。
		GEN(jump,temp1,temp2,temp3);
		return true;
	case 37:
		quad.push(16);
		return true;
	case 38:
		quad.push(17);
		return true;
	case 39:
		quad.push(15);
		return true;
	case 40:
		quad.push(13);
		return true;
	case 41:
		quad.push(14);
		return true;
	case 42:
		quad.push(12);
		return true;
	default: return false;
	}
}

⌨️ 快捷键说明

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