📄 lrsemanticor.cpp
字号:
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 + -