📄 第二题.cpp
字号:
p[t++]=c;
f.get(c);if(c=='\n')i5++;
}
if(c=='\'')
{f.get(c);if(c=='\n')i5++;}
p[t]='\0';
t=0;
q[i1-1]=new char;
strcpy(q[i1-1],p);
i1++;
y2=new two;
y2->w1=38;
strcpy(y2->w2,p);
y2->next=NULL;
y1->next=y2;
y2->prio=y1;
y1=y2;
}
else
if(65<=int(c)&&int(c)<=90||97<=int(c)&&int(c)<=122||48<=int(c)&&int(c)<=57)//识别单词
{
p[t]=c;
t++;
f.get(c);if(c=='\n')i5++;
while(65<=int(c)&&int(c)<=90||97<=int(c)&&int(c)<=122||48<=int(c)&&int(c)<=57)
{
if(!f.eof())
{
p[t]=c;
t++;
f.get(c);if(c=='\n')i5++;
}
else
break;
}
p[t]='\0';
w=find(p);
if(w==0)
{
if(65<=int(p[0])&&int(p[0])<=90||97<=int(p[0])&&int(p[0])<=122)//识别标识符
{
y2=new two;
y2->w1=36;
strcpy(y2->w2,p);
y2->next=NULL;
y1->next=y2;
y2->prio=y1;
y1=y2;
}
}
t=0;
}
if(!(65<=int(c)&&int(c)<=90||97<=int(c)&&int(c)<=122||48<=int(c)&&int(c)<=57)&&c!=' '&&c!='\n')//识别单界符
{
if(c=='/')
{
p[t++]=c;
f.get(c);if(c=='\n')i5++;
if(c=='*')
{
while(1)
{
f.get(c);if(c=='\n')i5++;
if(c=='*')
{
f.get(c);if(c=='\n')i5++;
if(c=='/')
{
break;
}
}
if(c=='\n') //报错
{
q1[i4]='*';
q2[i4]=i5;
i4++;
break;
}
}
f.get(c);if(c=='\n')i5++;
}
else
{
p[t]='\0';
t=0;
find(p);
d=1;
}
}
if(!(65<=int(c)&&int(c)<=90||97<=int(c)&&int(c)<=122||48<=int(c)&&int(c)<=57))
{
p[t]=c;
t++;
if(c==':'||c=='<'||c=='>'||c=='.')
{
f.get(c);if(c=='\n')i5++;
if(c=='='||c=='>'||c=='.')
{
p[t++]=c;
}
else d=1;
}
p[t]='\0';
w=find(p);
if(w==0&&c!='\n'&&c!=' '&&!f.eof())
{
q1[i4]='m';
q2[i4]=i5;
i4++;
}//报错
}
}
t=0;
if(d==0)
{
f.get(c);if(c=='\n')i5++;
}
else d=0;
}
cout<<endl;
y2=head->next;
int i=0;
while(y2!=NULL)
{
cout<<"("<<y2->w1<<","<<y2->w2<<")\t";
i++;
if(i==5)
{
cout<<endl;
i=0;
}
y2=y2->next;
}
cout<<endl;
for(int y=0;y<i4;y++) //输出查找到的错误
{
if(q1[y]=='\'')
{
cout<<"第"<<y+1<<"个错误,"<<"第"<<q2[y]-1<<"行缺少字符\'"<<endl;
}
if(q1[y]=='1')
{
cout<<"第"<<y+1<<"个错误,"<<"第"<<q2[y]<<"行非法定义整数"<<endl;
}
if(q1[y]=='*')
{
cout<<"第"<<y+1<<"个错误,"<<"第"<<q2[y]-1<<"行缺少符号*/"<<endl;
}
if(q1[y]=='m')
{
cout<<"第"<<y+1<<"个错误,"<<"第"<<q2[y]<<"行出现非法字符"<<endl;
}
}
cout<<endl;
if(i4==0)
{
return 1;
}
else return 0;
}
int find(char *p) //在单词编码中查找并输出
{
int m=1;
while(m<=60)
{
if(strcmp(s[m],p)==0)
{
y2=new two;
y2->w1=m;
strcpy(y2->w2,"-");
y2->next=NULL;
y1->next=y2;
y2->prio=y1;
y1=y2;
break;
}
m++;
}
if(m==61)return 0;
else return 1;
}
void print ()
{
y5=he->next;
while(y5!=NULL)
{
if(!strcmp(y5->p4,"f"))
{
y5->p4[0]=char(i6+1+48);y5->p4[1]='\0';
}
cout<<"("<<y5->p5<<")\t"<<"("<<y5->p1<<","<<y5->p2<<","<<y5->p3<<","<<y5->p4<<")"<<endl;
y5=y5->next;
}
}
void check7()
{
four *y8,*y9;
int i,tr1,tr2,f3,d1=0;
char *p,d[10];
while(y2!=NULL&&!(y2->w1==34||y2->w1==23||y2->w1==15||y2->w1==26||y2->w1==51))
{
y2=y2->next;
y1=y1->next;
}
if(y2!=NULL)
switch(y2->w1)
{
case 23: cout<<"("<<i6++<<")\t"<<"(program,"<<y2->next->w2<<",-,-)"<<endl; //输出程序名
break;
case 34:i=i6; //入口地址,while语句处理
y9=y3;
check5();//布尔表达式的处理
tr1=i6;
check7();//递归
y4=new four;y4->next=NULL;
y3->next=y4;y3=y4;
strcpy(y4->p1,"j");
strcpy(y4->p2,"-");
strcpy(y4->p3,"-");
if(i>9)
{
int f3,f4;
f3=i/10;f4=i%10;
y4->p4[0]=char(f3+48);y4->p4[1]=char(f4+48);y4->p4[2]='\0';
}
else
{
y4->p4[0]=char(i+48);y4->p4[1]='\0';
}
y4->p5=i6++;modify(y4);
y9=y9->next;
while(y9!=NULL)
{
if(!strcmp(y9->p4,"f")) //假出口回填
{
if(i6>9)
{
int f3,f4;f3=i6/10;f4=i6%10;
y9->p4[0]=char(f3+48);y9->p4[1]=char(f4+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(i6+48);y9->p4[1]='\0';
}
}
if(!strcmp(y9->p4,"tr")) //真出口回填
{
if(tr1>9)
{
int f3,f4;f3=tr1/10;f4=tr1%10;
y9->p4[0]=char(f3+48);y9->p4[1]=char(f4+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(tr1+48);y9->p4[1]='\0';
}
}
y9=y9->next;
}
break;
case 15:y9=y3;
check5(); //if语句处理
tr2=i6; //真出口
check7(); //递归
y9=y9->next;
/*if(y2!=NULL)
{
y2=y2->next;
y1=y1->next;
d1=1;
}*/
if(y2->w1==11)
{
while(y9!=NULL)
{
if(!strcmp(y9->p4,"f")) //假出口回填
{
y8=y9;
if((i6+1)>9)
{
int f4,f5;
f4=(i6+1)/10;f5=(i6+1)%10;
y9->p4[0]=char(f4+48);y9->p4[1]=char(f5+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(i6+1+48);y9->p4[1]='\0';
}
}
if(!strcmp(y9->p4,"tr")) //真出口回填
{
if(tr2>9) //f3为两位数时,没有设计成更高位数
{
int f4,f5;
f4=tr2/10;f5=tr2%10;
y9->p4[0]=char(f4+48);y9->p4[1]=char(f5+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(tr2+48);y9->p4[1]='\0';
}
}
y9=y9->next;
}
y4=new four;y4->next=NULL;
y3->next=y4;y3=y4;
strcpy(y4->p1,"j");
strcpy(y4->p2,"-");
strcpy(y4->p3,"-");
y8=y4;
y4->p5=i6++;modify(y4);
check7();
if(i6>9)
{
int f3,f4;
f3=i6/10;f4=i6%10;
y8->p4[0]=char(f3+48);y8->p4[1]=char(f4+48);y8->p4[2]='\0';
}
else
{
y8->p4[0]=char(i6+48);y8->p4[1]='\0';
}
}
else
{
while(y9!=NULL)
{
if(!strcmp(y9->p4,"f")) //假出口回填
{
y8=y9;
if(i6>9)
{
int f4,f5;
f4=i6/10;f5=i6%10;
y9->p4[0]=char(f4+48);y9->p4[1]=char(f5+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(i6+48);y9->p4[1]='\0';
}
}
if(!strcmp(y9->p4,"tr")) //真出口回填
{
if(tr2>9) //f3为两位数时,没有设计成更高位数
{
int f4,f5;
f4=tr2/10;f5=tr2%10;
y9->p4[0]=char(f4+48);y9->p4[1]=char(f5+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(tr2+48);y9->p4[1]='\0';
}
}
y9=y9->next;
}
}
break;
case 26:f3=i6; //入口地址,repeat语句处理
y9=y3;
if(y2!=NULL)
{
y2=y2->next;
y1=y1->next;
}
check7();
check5();
y9=y9->next;
while(y9!=NULL)
{
if(!strcmp(y9->p4,"f")) //假出口回填
{
if(f3>9) //f3为两位数时,没有设计成更高位数
{
int f4,f5;
f4=f3/10;f5=f3%10;
y9->p4[0]=char(f4+48);y9->p4[1]=char(f5+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(f3+48);y9->p4[1]='\0';
}
}
if(!strcmp(y9->p4,"tr")) //真出口回填
{
if((i6+2)>9)
{
int f4,f5;
f4=(i6+2)/10;f5=(i6+2)%10;
y9->p4[0]=char(f4+48);y9->p4[1]=char(f5+48);y9->p4[2]='\0';
}
else
{
y9->p4[0]=char(i6+2+48);y9->p4[1]='\0';
}
}
y9=y9->next;
}
break;
case 51:p=y1->w2; //赋值语句处理
i=check3();
if(i==0)
{
y4=new four;y4->next=NULL;
y3->next=y4;y3=y4;
y4->p5=i6++;strcpy(y4->p1,":=");strcpy(y4->p2,y2->w2);
strcpy(y4->p3,"-");strcpy(y4->p4,p);
/*cout<<"("<<i6++<<")\t"<<"(:=,"<<y2->w2<<",-,"<<p<<")"<<endl;*/
}
else
{
y4=new four;y4->next=NULL;
y3->next=y4;y3=y4;
y4->p5=i6++;strcpy(y4->p1,":=");d[0]='T';d[1]=char(--i7+48);d[2]='\0';
strcpy(y4->p2,d);
strcpy(y4->p3,"-");strcpy(y4->p4,p);
/*cout<<"("<<i6++<<")\t"<<"(:=,T"<<--i7<<",-,"<<p<<")"<<endl;*/
i7++;
}
break;
}
if(y2!=NULL&&d1==0)
{
y2=y2->next;
y1=y1->next;
}
else
{
d1=0;
}
}
void modify(four*y0)
{
char d[3];
if(y0->p5>9)
{
int f3,f4;
f3=y0->p5/10;f4=y0->p5%10;
d[0]=char(f3+48);d[1]=char(f4+48);d[2]='\0';
}
else
{
d[0]=char(y0->p5+48);d[1]='\0';
}
four*y7;
y7=he->next;
while(y7!=NULL)
{
if(!strcmp(y7->p4,d))
{
strcpy(y7->p4,y0->p4);
}
y7=y7->next;
}
}
int cavil() //找错
{
two*g[20];int top=0,d=1,d2=1,p=0;
int stack3[10],top3=-1;
y2=y1=head->next;
while(y2->w1!=52){y2=y2->next;}//屏蔽第一行
while(y2!=NULL) //未定义先使用
{
if(y2->w1==33)
{
p=top;
do
{
y2=y2->next;
if(y2->w1==36)
{
g[top++]=y2;
}
}while(y2->w1!=50);
y2=y2->next;
for(;p<top;p++) //记录变量类型
{
g[p]->w1=y2->w1;
}
}
if(y2->w1==36)
{
for(int m=0;m<top;m++)
{
if(!strcmp(g[m]->w2,y2->w2))
{
d=0;
y2->w1=g[m]->w1;
break;
}
}
if(d!=0)
{
y1=y2;
cout<<y2->w2<<"未定义先使用!!"<<endl;
d=1;
d2=0;
}else d=1;
}
if(y2->w1==37)y2->w1=17;
if(y2->w1==38)y2->w1=7;
y2=y2->next;
}
y2=head->next;
while(y2!=NULL) //保留字不匹配的错误
{
switch(y2->w1)
{
case 3:stack3[++top3]=3;break;
case 15:stack3[++top3]=15;break;
case 26:stack3[++top3]=26;break;
case 34:stack3[++top3]=34;break;
case 12:for(;top3>=0;top3--)
{
if(stack3[top3]==3)
{
top3--;break;
}
else
{
cout<<s[stack3[top3]]<<"缺少匹配的保留字!!"<<endl;
d2=0;
}
}
break;
case 29:for(;top3>=0;top3--)
{
if(stack3[top3]==15)
{
top3--;break;
}
else
{
cout<<s[stack3[top3]]<<"缺少匹配的保留字!!"<<endl;
d2=0;
}
}break;
case 32:for(;top3>=0;top3--)
{
if(stack3[top3]==26)
{
top3--;break;
}
else
{
cout<<s[stack3[top3]]<<"缺少匹配的保留字!!"<<endl;
d2=0;
}
}break;
case 10:for(;top3>=0;top3--)
{
if(stack3[top3]==34)
{
top3--;break;
}
else
{
cout<<s[stack3[top3]]<<"缺少匹配的保留字!!"<<endl;
d2=0;
}
}
}
y2=y2->next;
}
if(top3!=-1)
{
while(top3!=-1)
{
cout<<s[stack3[top3]]<<"缺少匹配的保留字!!"<<endl;
top3--;
}
d2=0;
}
top3=-1;
y2=head->next;
d=0;
while(y2!=NULL) //赋值表达式左右类型不匹配的错误
{
if(y2->w1==51)
{
y1=y2->prio;
y2=y2->next;
while(y2!=NULL&&(y2->w1==4||y2->w1==7||y2->w1==17||y2->w1==41||y2->w1==43||y2->w1==45||y2->w1==48))
{
if(y2->w1==4||y2->w1==7||y2->w1==17)
{
if(y2->w1!=y1->w1)
{
d=1;
}
}
y2=y2->next;
}
if(d==1)//d=1说明有错误
{
d2=0;
d=0;
while(y1!=y2)
{
if(y1->w1==4||y1->w1==7||y1->w1==17||y1->w1==36)
{
cout<<y1->w2;
}
else
{
cout<<s[y1->w1];
}
y1=y1->next;
}
cout<<"表达式左右类型不匹配!!"<<endl;
}
}
if(y2!=NULL)
{
y2=y2->next;
}
}
return d2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -