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

📄 第二题.cpp

📁 编译原理语法分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					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 + -