📄 parser.cpp
字号:
}
fclose(SymbleFin);
}
return;
}
/*******************赋值句分析******************/
int S_Let(int a)
{ int addr,flag,rtn;
flag=0;
rtn=0;
InitStack();
if(code==34)
{ addr=address;
if(a) let_count=addr;
var_count++;
GetNext();
if(code==51)
{ flag=E_Analize();
if(flag!=0) rtn=EquPush(1,flag,0,addr);
}
}
else
Error(4);
return rtn;
}
/***********************算术表达式分析********************/
int E_Analize()
{ int ans;
ans=0;
now_addr=0;
E_Init();
ans=E_AddSub();
if(expr[now_addr].addr!=0) //表达式没识别完
Error(7);
return ans;
}
void E_Init()
{ int flag=1,i;
pos=0;
E_rtn=0;
E_Contrl=1;
for(i=0;i<EXP_LEN;i++)
{ expr[i].addr=0;
expr[i].cod=0;
}
while(flag)
{ GetNext();
switch(code){
case 34: Push(code,address);break; //变量
case 35: Push(code,address);break; //整数
case 36: Push(code,address);break; // 实数
case 39: Push(code,address);break; //"("
case 40: Push(code,address);break; //")"
case 41: Push(code,address);break; //"*"
case 43: Push(code,address);break; //"+"
case 45: Push(code,address);break; //"-"
case 48: Push(code,address);break; //"/"
default: flag=0;break;
}
}
return;
}
int NewTemp()
{ int a;
temp_count--;
a=temp_count;
return a;
}
int E_AddSub()
{ int t1;
int rtn=T_MulDiv();
t1=rtn;
rtn=E1_AddSub(t1);
return rtn;
}
int E1_AddSub(int a)
{ int rtn,t1;
rtn=a;
if(expr[now_addr].cod==43 || expr[now_addr].cod==45)
{ int op=expr[now_addr++].cod;
int opr2=T_MulDiv();
t1=NewTemp();
if(op==43)
{ if(E_Contrl)
{ E_Contrl=0;
E_rtn=EquPush(2,rtn,opr2,t1);
}
else
{ E_rtn=EquPush(2,rtn,opr2,t1);
}
rtn=t1;
}
else
{ if(E_Contrl)
{ E_Contrl=0;
E_rtn=EquPush(3,rtn,opr2,t1);
}
else
{ E_rtn=EquPush(3,rtn,opr2,t1);
}
rtn=t1;
}
if(expr[now_addr].cod==43 || expr[now_addr].cod==45) 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 t1,rtn;
rtn=a;
if(expr[now_addr].cod==41 || expr[now_addr].cod==48)
{ int op=expr[now_addr++].cod;
int opr2=F_Number();
t1=NewTemp();
if(op==41)
{ if(E_Contrl)
{ E_Contrl=0;
E_rtn=EquPush(4,rtn,opr2,t1);
}
else
{ E_rtn=EquPush(4,rtn,opr2,t1);
}
rtn=t1;
}
else
{ if(E_Contrl)
{ E_Contrl=0;
E_rtn=EquPush(5,rtn,opr2,t1);
}
else
{ E_rtn=EquPush(5,rtn,opr2,t1);
}
rtn=t1;
}
if(expr[now_addr].cod==41 || expr[now_addr].cod==48) rtn=T1_MulDiv(t1);
}
return rtn;
}
int F_Number()
{ int rtn=0;
if(expr[now_addr].cod==39) //如果是"("
{ now_addr++;
rtn=E_AddSub();
now_addr++;
}
else
{ switch(expr[now_addr].cod) {
case 34: rtn=expr[now_addr].addr;break;
case 35: rtn=expr[now_addr].addr;break;
case 36: rtn=expr[now_addr].addr;break;
case 37: 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]=0;
}
}
/***********************复合语句分析*****************/
int S_Begin()
{ int rtn=0;
if(code==52) {GetNext();LineOfPro++;}
if(code==3)
{ LineOfPro++;
GetNext();
rtn=L_Analize();
if(code!=11)
{ Error(5);
LineOfPro++;
return 0;
}
else
{ LineOfPro++;GetNext();
}
}
return rtn;
}
/**********************语句序列分析*********************************/
int L_Analize()
{ int rtn=0;
switch(code){
case 34: S_Let(0);rtn=E_rtn;break;
case 14:rtn=S_If();break;
case 32:rtn=S_While();break;
default:Error(6);return 0;
}
if(code==52)
{ LineOfPro++;
GetNext();
switch(code){
case 34: L_Analize();return rtn;
case 32: L_Analize();return rtn;
case 25: L_Analize();return rtn;
case 13: L_Analize();return rtn;
case 14: 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==14) //code==14是if语句
{ temp=LineOfEqu+1;
B_Init(); //读入if后面的表达式放入expr[]中
b_addr=B_Analize(); //b_addr=bool表达式四元式首址
True_address=EquPush(11,b_addr,ZERO,1);
False_address=EquPush(6,0,0,0);
if(code==27) //code==27是then语句
{ GetNext();
switch(code){
case 34: rtn=S_Let(0);break;
case 14: rtn=S_If();break;
case 32: rtn=S_While();break;
case 3: rtn=S_Begin();break;
default: Error(6);break;
}
BackPatch(True_address,rtn+1);
tt=LineOfEqu+1;
as=EquPush(6,0,0,tt);
if(code==10)
{ GetNext();
switch(code)
{
case 34: tt=S_Let(0);break;
case 14: tt=S_If();break;
case 32: tt=S_While();break;
case 3: 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 lineback=LineOfEqu; //新加的
int rtn=0;
int temp=0;
int b_addr=0;
if(code==52){GetNext();LineOfPro++;}
if(code==32)
{
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==9)
{GetNext();
switch(code){
case 34: rtn=S_Let(0);break;
case 14: rtn=S_If();break;
case 32: rtn=S_While();break;
case 3: rtn=S_Begin();break;
default: Error(6);return 0;
}
GetNext();
BackPatch(True_address,rtn);
}
else{Error(WHILE);return 0;}
}
EquPush(6,0,0,lineback+1);
BackPatch(False_address,LineOfEqu+1);
return temp;
}
/*******************布尔表达式分析**************************/
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 34: Push(code,address);break;
case 35: Push(code,address);break;
case 17: Push(code,address);break;
case 1: Push(code,address);break;
case 53: Push(code,address);break;
case 54: Push(code,address);break;
case 55: Push(code,address);break;
case 56: Push(code,address);break;
case 57: Push(code,address);break;
case 58: Push(code,address);break;
case 19: Push(code,address);break;
case 29: Push(code,address);break;
case 12: 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==24)
{ int op=2;
int op2=L_AND();
t1=NewTemp();
EquPush(op,rtn,op2,t1);
rtn=t1;
if(expr[now_addr].cod==24) 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==19)
{ 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 34: temp=NewTemp();
a=K_CMP();
if(a)
{
rtn=a; break;
}
else
{
EquPush(1,expr[now_addr-1].addr,0,temp);
rtn=temp;break;
}
case 35: temp=NewTemp();
a=K_CMP();
if(a) { return rtn=a;break;}
else
{
EquPush(1,expr[now_addr-1].addr,0,temp);
rtn=temp;break;
}
case 39: rtn=B_Analize();
if(expr[now_addr].cod!=50)
{
Error(B_EXP);
rtn=ZERO;
}
break;
case 12: rtn=ZERO;break;
case 29: 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>52) && (expr[now_addr].cod<59))
{
EquPush(3,expr[now_addr-1].addr,expr[now_addr+1].addr,t1);
switch(expr[now_addr].cod)
{
case 53:EquPush(9,t1,ZERO,LineOfEqu+4);break; // <
case 54:EquPush(8,t1,ZERO,LineOfEqu+4);break; // <=
case 55:EquPush(8,t1,ZERO,LineOfEqu+4);break; // <>
case 56:EquPush(11,t1,ZERO,LineOfEqu+4);break; // =
case 57:EquPush(10,t1,ZERO,LineOfEqu+4);break; // >
case 58: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;
}
int main()
{
parser();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -