📄 语法分析程序.cpp
字号:
t1=NewTemp();
if(op==35){
if(E_Contrl){
E_Contrl=0;
E_rtn=EquPush(2,rtn,opr2,t1);
}
else{EquPush(2,rtn,opr2,t1);}
rtn=t1;
}
else{
if(E_Contrl){
E_Contrl=0;
E_rtn=EquPush(3,rtn,opr2,t1);
}
else{EquPush(3,rtn,opr2,t1);}
rtn=t1;
}
if(expr[now_addr].cod==35||expr[now_addr].cod==36)
rtn=E1_AddSub(t1);
}
return rtn;
}
int T_MulDiv(){
int t1;
int rtn=F_Number();
t1=rtn;
rtn=T1_MulDiv(t1);
return rtn;
}
int T1_MulDiv(int a){
int rtn,t1;
rtn=a;
if(expr[now_addr].cod==34||expr[now_addr].cod==39){
int op=expr[now_addr++].cod;
int opr2=F_Number();
t1=NewTemp();
if(op==34){
if(E_Contrl){
E_Contrl=0;
E_rtn=EquPush(4,rtn,opr2,t1);
}
else{EquPush(4,rtn,opr2,t1);}
rtn=t1;
}
else{
if(E_Contrl){
E_Contrl=0;
E_rtn=EquPush(5,rtn,opr2,t1);
}
else{EquPush(5,rtn,opr2,t1);}
rtn=t1;
}
if(expr[now_addr].cod==34||expr[now_addr].cod==39)
rtn=T1_MulDiv(t1);
}
return rtn;
}
int F_Number(){
int rtn=0;
if(expr[now_addr].cod==32){
now_addr++;
rtn=E_AddSub();
if(expr[now_addr++].cod!=40) Error(7);
}
else{
switch(expr[now_addr].cod){
case 27:rtn=expr[now_addr].addr;break;
case 28:rtn=expr[now_addr].addr;break;
case 29:rtn=expr[now_addr].addr;break;
case 30:rtn=expr[now_addr].addr;break;
default: Error(7);break;
}
var_count++;
now_addr++;
}
return rtn;
}
void Push(int cod,int addr){
int j;
expr[pos].addr=addr;
expr[pos].cod=cod;
for(j=0;j<20;j++) expr[pos].name[j]=ID[j];
pos++;
return;
}
void InitStack(){
int i,j;
pos=0;
now_addr=0;
for(i=0;i<EXP_LEN;i++){
expr[i].addr=0;
expr[i].cod=0;
for(j=0;j<20;j++)expr[i].name[j];
}
}
/***********复合语句分析***********/
int S_Begin(){
int rtn=0;
if(code==42){GetNext();LineOfPro++;}
if(code==2){
LineOfPro++;
GetNext();
rtn=L_Analize();
if(code!=10){
Error(5);LineOfPro++;return 0;
}
else{LineOfPro++;GetNext();}
}
return rtn;
}
/************语句序列分析****************/
int L_Analize(){
int rtn=0;
switch(code){
case 27:S_Let(0);rtn=E_rtn;break;
case 13:rtn=S_If();break;
case 26:rtn=S_While();break;
case 20:rtn=S_Repeat();break;
case 12:rtn=S_For();break;
default: Error(6);return 0;
}
if(code==42){
LineOfPro++;
GetNext();
switch(code){
case 27:L_Analize();return rtn;
case 26:L_Analize();return rtn;
case 20:L_Analize();return rtn;
case 12:L_Analize();return rtn;
case 13:L_Analize();return rtn;
default: return rtn;
}
}
return rtn;
}
/**********if语句分析*********/
int S_If(){
int rtn=0;
int temp=0;
int as;
int b_addr=0,tt=0;
if(code==13){
temp=LineOfEqu+1;
B_Init();
b_addr=B_Analize();
True_address=EquPush(11,b_addr,ZERO,1);
False_address=EquPush(6,0,0,0);
if(code==21){
GetNext();
switch(code){
case 27:rtn=S_Let(0);break;
case 13:rtn=S_If();break;
case 26:rtn=S_While();break;
case 20:rtn=S_Repeat();break;
case 12:rtn=S_For();break;
case 2:rtn=S_Begin();break;
default: Error(6);return 0;
}
BackPatch(True_address,rtn+1);
tt=LineOfEqu+1;
as=EquPush(6,0,0,tt);
if(code==9){
GetNext();
switch(code){
case 27:tt=S_Let(0);break;
case 13:tt=S_If();break;
case 26:tt=S_While();break;
case 20:tt=S_Repeat();break;
case 12:tt=S_For();break;
case 2:tt=S_Begin();break;
default: Error(6);return 0;
}
}
BackPatch(False_address,tt+1);
BackPatch(as,LineOfEqu+1);
}
else{Error(IF);return 0;}
}
return temp;
}
/*************while语句分析*************/
int S_While(){
int rtn=0;
int temp=0;
int b_addr=0;
if(code==42){GetNext();LineOfPro++;}
if(code==26){
temp=LineOfEqu+1;
B_Init();
b_addr=B_Analize();
True_address=EquPush(11,b_addr,ZERO,1);
False_address=EquPush(6,0,0,0);
if(code==8){
GetNext();
switch(code){
case 27:rtn=S_Let(0);break;
case 13:rtn=S_If();break;
case 26:rtn=S_While();break;
case 20:rtn=S_Repeat();break;
case 12:rtn=S_For();break;
case 2:rtn=S_Begin();break;
default: Error(6);return 0;
}
GetNext();
BackPatch(True_address,rtn);
}
else{Error(WHILE);return 0;}
}
BackPatch(False_address,LineOfEqu+1);
return temp;
}
/***************for语句分析***************/
int S_For(){
int rtn=0,jmp_addr;
int addr2;
if(code==42){GetNext();LineOfPro++;}
if(code==12){
GetNext();
rtn=S_Let(1);
if(code==22){
GetNext();
if((code==27)||(code==28)){
addr2=address;
GetNext();
if(code==8){
GetNext();
switch(code){
case 27:jmp_addr=S_Let(0);break;
case 13:jmp_addr=S_If();break;
case 26:jmp_addr=S_While();break;
case 20:jmp_addr=S_Repeat();break;
case 12:jmp_addr=S_For();break;
case 2:jmp_addr=S_Begin();break;
default: Error(6);return 0;
}
EquPush(2,let_count,ONE,let_count);
EquPush(7,let_count,addr2,jmp_addr);
}
else{Error(FOR);return 0;}
}
else{Error(FOR);return 0;}
}
else{Error(FOR);return 0;}
}
return rtn;
}
/**************repreat语句分析************/
int S_Repeat(){
int rtn=0;
int b_addr=0;
if(code==42){GetNext();LineOfPro++;}
if(code==20){
GetNext();
switch(code){
case 27:rtn=S_Let(0);break;
case 13:rtn=S_If();break;
case 26:rtn=S_While();break;
case 20:rtn=S_Repeat();break;
case 12:rtn=S_For();break;
case 2:rtn=S_Begin();break;
default: Error(6);return 0;
}
if(code==42){LineOfPro++;GetNext();}
else{Error(51);return 0;}
if(code==24){
B_Init();
b_addr=B_Analize();
EquPush(11,b_addr,ZERO,rtn);
}
else{Error(REPEAT);return 0;}
}
return rtn;
}
/**************布尔表达式分析****************/
int B_Analize(){
int rtn=0;
rtn=B_OR();
if(expr[now_addr].cod!=0)Error(12);
return rtn;
}
void B_Init(){
int flag=1;
InitStack();
while(flag){
GetNext();
switch(code){
case 27:Push(code,address);break;
case 28:Push(code,address);break;
case 15:Push(code,address);break;
case 1:Push(code,address);break;
case 43:Push(code,address);break;
case 44:Push(code,address);break;
case 45:Push(code,address);break;
case 46:Push(code,address);break;
case 47:Push(code,address);break;
case 48:Push(code,address);break;
case 17:Push(code,address);break;
case 23:Push(code,address);break;
case 11:Push(code,address);break;
default:flag=0;break;
}
}
}
int B_OR(){
int rtn=0;
int t1;
rtn=L_AND();
t1=rtn;
rtn=B1_OR(t1);
return rtn;
}
int B1_OR(int a){
int t1,rtn;
rtn=a;
if(expr[now_addr++].cod==19){
int op=2;
int op2=L_AND();
t1=NewTemp();
EquPush(op,rtn,op2,t1);
rtn=t1;
if(expr[now_addr].cod==19)rtn=B1_OR(t1);
}
return rtn;
}
int L_AND(){
int rtn=0;
int t1;
rtn=M_NOT();
t1=rtn;
rtn=L1_AND(t1);
return rtn;
}
int L1_AND(int a){
int t1,rtn;
rtn=a;
if(expr[now_addr++].cod==1){
int op=4;
int op2=M_NOT();
t1=NewTemp();
EquPush(op,rtn,op2,t1);
rtn=t1;
if(expr[now_addr].cod==1)rtn=L1_AND(t1);
}
return rtn;
}
int M_NOT(){
int rtn=0;
int temp=0;
int op2=0;
if(expr[now_addr].cod=17){
int op=3;
now_addr++;
op2=K_END();
temp=NewTemp();
EquPush(op,ONE,op2,temp);
}
else{rtn=K_END();temp=rtn;}
return temp;
}
int K_END(){
int rtn=0;
int temp,a;
temp=0;
switch(expr[now_addr++].cod){
case 27:temp=NewTemp();
a=K_CMP();
if(a){rtn=a;break;}
else{
EquPush(1,expr[now_addr-1].addr,0,temp);
rtn=temp;break;
}
case 28:temp=NewTemp();
a=K_CMP();
if(a){rtn=a;break;}
else{
EquPush(1,expr[now_addr-1].addr,0,temp);
rtn=temp;break;
}
case 32:rtn=B_Analize();
if(expr[now_addr].cod!=40){
Error(B_EXP);
rtn=ZERO;}
break;
case 11:rtn=ZERO;break;
case 23:rtn=ONE;break;
default:break;
}
return rtn;
}
int K_CMP(){
int rtn=0;
int t1,t2;
t1=NewTemp();
t2=NewTemp();
if((expr[now_addr].cod>42)&&(expr[now_addr].cod<49)){
EquPush(3,expr[now_addr-1].addr,expr[now_addr+1].addr,t1);
switch(expr[now_addr].cod){
case 43:EquPush(9,t1,ZERO,LineOfEqu+4);break;
case 44:EquPush(8,t1,ZERO,LineOfEqu+4);break;
case 45:EquPush(11,t1,ZERO,LineOfEqu+2);break;
case 46:EquPush(11,t1,ZERO,LineOfEqu+4);break;
case 47:EquPush(10,t1,ZERO,LineOfEqu+4);break;
case 48:EquPush(7,t1,ZERO,LineOfEqu+4);break;
}
EquPush(1,ONE,0,t2);
EquPush(6,0,0,LineOfEqu+3);
EquPush(1,ZERO,0,t2);
rtn=t2;
now_addr++;
}
return rtn;
}
/***************出口回填函数****************/
void BackPatch(int addr,int addr2){
Equ[addr].result=addr2;
return;
}
int EquPush(int op,int a,int b,int r){
int i=LineOfEqu;
Equ[LineOfEqu].op=op;
Equ[LineOfEqu].op1=a;
Equ[LineOfEqu].op2=b;
Equ[LineOfEqu].result=r;
LineOfEqu++;
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -