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

📄 while.cpp

📁 WHILE语句语法分析 ,含有源码,及报告书 WHILE循环语句的翻译程序设计.doc
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>

#define  buf 20
#define   MAXBUF 255

typedef struct Token
{
	int label;
	char name[buf];
	int code;
}Token;

typedef struct Symbol_i
{
	int symbol_i;
	int state;
}Symbol_i;

int Getsymbol();
void ERROR();
void S();           //S->while (B) S | i=E
void B();           //B->E relop E
void relop();       //relop->< | = | >
void E();           //E->(E)F | iF | nF
void F(int A);           //F->+EF | -EF | *EF | /EF | ε
void F();

char sym,ch;
int symbol_L=0,symbol_L1=0,symbol_L2=0,symbol_L3=0,symbol_L4=0;
int l,l1,l2,l3,l4;
int L_i=0,S_i=0,B_i=0,E_i=0,F_i=0,relop_i=0,i_i=0,n_i=0;
int k=0;
int re,n=0,t=0;
int i1=0,i2=0,i3=0,i4=0;
char *wh="while";
Token token1[MAXBUF],token2[MAXBUF];
Symbol_i L[MAXBUF],L1[MAXBUF],L2[MAXBUF],L3[MAXBUF],L4[MAXBUF];

FILE *input;
FILE *output;

int strcmp(char *s,char *t)
{
	for(;*s==*t;s++,t++)
		if(*s==0) return 0;
	return 1;
}

void main()
{
	if((input=fopen("input.txt","rt"))==NULL)
		printf("cannot open input file \n");
	if((output=fopen("output.txt","wt+"))==NULL)
		printf("cannot open output file\n");

	for(int i=0;i<MAXBUF;i++)
		for(int j=0;j<buf;j++)
		{
			token1[i].name[j]='\0';
			token1[i].name[j]='\0';
		}

	for(int j=0;j<MAXBUF;j++)
	{
		L[j].symbol_i=-1;
		L[j].state=0;
		L1[j].symbol_i=-1;
		L1[j].state=0;
		L2[j].symbol_i=-1;
		L2[j].state=0;
		L3[j].symbol_i=-1;
		L3[j].state=0;
		L4[j].symbol_i=-1;
		L4[j].state=0;
	}
	sym=fgetc(input);
	S();
	cout<<"Lnext:  exit"<<endl;
	fprintf(output,"%s","Lnext:  exit");
	cout<<endl;
	if(k==1)
	{
		cout<<"分析结束!"<<endl;
		cout<<"成功分析!"<<endl;
	}
}

int Getsymbol()
{
	while(sym!=EOF)
	{
		if((sym>='a'&&sym<='z')||(sym>='A'&&sym<='Z'))
		{
			int h1=0;
		    while((sym>='a'&&sym<='z')||(sym>='A'&&sym<='Z')||sym=='_'||(sym>='0'&&sym<='9'))
			{
				token1[t].name[i1++]=sym;
				n=t;
				sym=fgetc(input);
			}
			h1=strcmp(token1[t].name,wh);
			t++;
			i3=i1;
			i1=0;
			if(!h1) 
				return 16;              //返回while给主程序
			else 
				return 13;		
		}                              //已经取了下一个字符
		else
			if(sym>='0'&&sym<='9')
			{
				while(sym>='0'&&sym<='9')
				{
					token2[t].name[i2++]=sym;
					n=t;
					sym=fgetc(input);
				}
				t++;
				i4=i2;
				i2=0;
				return 12;			
			}
			else 
				if(sym=='/')
				{
					sym=fgetc(input);
					ch='/';
					return 1;
				}					
				else
					if(sym=='*')
					{
						sym=fgetc(input);
						ch='*';
						return 2;
					}						
					else 
						if(sym=='-')
						{
							sym=fgetc(input);
							ch='-';
							return 3;
						}						
						else
							if(sym=='+')
							{
								sym=fgetc(input);
								ch='+';
								return 4;
							}								
							else
								if(sym=='(')
								{
									sym=fgetc(input);
									return 15;
								}
								else
									if(sym==')')
									{
										sym=fgetc(input);
										return 14;
									}			
									else
										if(sym=='<')
										{
											sym=fgetc(input);
											ch='<';
											return 9;
										}		
										else 
											if(sym=='=')
											{
												sym=fgetc(input);
												ch='=';
												return 10;
											}								
											else
												if(sym=='>')
												{
													sym=fgetc(input);
													ch='>';
													return 11;
												}				
												else
													if(sym==';'&&k!=1)
													{
														ch=';';														
														k=1;
														return 20;
														break;
													}
													else
														if(k!=1)
														{
															sym=fgetc(input);
														}	
												
	}
	return 0;
}

void S()                                //S->while (B) S | i=E  
{
	re=Getsymbol();//cout<<re<<"  S"<<endl;

	if(re==16)//
	{
		cout<<"L"<<L_i<<":   "<<"if ( B"<<B_i<<" )  goto L"<<L_i+1<<endl;
		fprintf(output,"%s%d%s%d%s%d%s","L",L_i,":   if ( B",B_i," )  goto L",L_i+1,"\n");
		cout<<"     else   goto Lnext"<<endl;
		fprintf(output,"%s","else      goto Lnext\n\n");
		L_i++;
		//cout<<endl;
		re=Getsymbol();//cout<<re<<"  S"<<endl;

		if(re==15)
		{
			B();
			if(re==14)
				S();
			else
				ERROR();
		}
		else
			ERROR();
	}
	else
		if(re==13)
		{
			cout<<"L"<<L_i<<":   "<<"i"<<i_i<<" = E"<<E_i<<endl;
			fprintf(output,"%s%d%s%d%s%d%s","L",L_i,":   i",i_i," = E",E_i,"\n\n");
			L_i++;
			//cout<<endl;
			cout<<"  i"<<i_i<<":=";
			fprintf(output,"%s%d%s","  i",i_i,":=");
			for(int i=0;i<=i3;i++)
				if(token1[n].name[i]!='\0')
				{
					cout<<token1[n].name[i];
					fprintf(output,"%c",token1[n].name[i]);
				}
			i_i++;
			cout<<endl;//<<endl;
			fprintf(output,"%s","\n\n");

			re=Getsymbol();//cout<<re<<"  S"<<endl;
			if(re==10)	
				E();
			else
				ERROR();
		}
		else
			ERROR();
}

void B()    //                            //B->E relop E
{
	cout<<"  B"<<B_i<<":=E"<<E_i<<" relop"<<relop_i<<" E"<<E_i+1<<endl;
	fprintf(output,"%s%d%s%d%s%d%s%d%s","  B",B_i,":=E",E_i," relop",relop_i," E",E_i+1,"\n\n");
	//cout<<endl;
	B_i++;
	E();
	relop();
	E();
}
 
void relop()                             //relop->< | = | >
{
	if(re==9)
	{
		cout<<"  relop"<<relop_i<<":= <"<<endl;
		fprintf(output,"%s%d%s","  relop",relop_i,":= <\n\n");
		relop_i++;
		//cout<<endl;
	}//cout<<re<<"  relop"<<endl;
	else
		if(re==10)
		{
			cout<<"  relop"<<relop_i<<":= ="<<endl;
			fprintf(output,"%s%d%s","  relop",relop_i,":= =\n\n");
		    relop_i++;
		    //cout<<endl;
		}//cout<<re<<"  E"<<endl;
		else
			if(re==11)
			{
				cout<<"  relop"<<relop_i<<":= >"<<endl;
				fprintf(output,"%s%d%s","  relop",relop_i,":= >\n\n");
		        relop_i++;
				//cout<<endl;
			}//cout<<re<<"  E"<<endl;
			else
				ERROR();
}

void E()                                //E->(E)F | iF | nF
{
	re=Getsymbol()		;//cout<<re<<"  E"<<endl;
	if(re==15)
	{
		cout<<"  E"<<E_i<<":=( E"<<E_i+1<<" ) F"<<F_i<<endl;
		fprintf(output,"%s%d%s%d%s%d%s","  E",E_i,":=( E",E_i+1," ) F",F_i,"\n\n");
		E_i++;
		L[symbol_L].symbol_i=F_i;//L=F_i;
		l=symbol_L;
		symbol_L++;
		F_i++;		
		//cout<<endl;
		E();
		if(re==14)
		{
			re=Getsymbol();//cout<<re<<"  E"<<endl;
			if(re==4||re==3||re==2||re==1||re==20)
			{
				while(l>=0)
				{
					if(L[l].state==0)
					{
						F(L[l].symbol_i);
					    L[l].state=1;
					}
					else
					{
						l--;
					}
				}
			}
			else
				F();
		}
		else
			ERROR();
	}
	else
		if(re==12)
		{
			cout<<"  E"<<E_i<<":="<<"n"<<n_i<<" F"<<F_i<<endl;
			fprintf(output,"%s%d%s%d%s%d%s","  E",E_i,":=n",n_i," F",F_i,"\n\n");
			//cout<<endl;
			E_i++;

			cout<<"  n"<<n_i<<":=";
			fprintf(output,"%s%d%s","  n",n_i,":=");
			for(int i=0;i<=i4;i++)
			{
				cout<<token2[n].name[i];
				fprintf(output,"%c",token2[n].name[i]);
			}
			cout<<endl;//<<endl;
			fprintf(output,"%s","\n\n");
			n_i++;

		    re=Getsymbol();//cout<<re<<"  E"<<endl;
			if(re==4||re==3||re==2||re==1)
				F();
			else
				F(F_i);
		}
		else
			if(re==13)
			{
				cout<<"  E"<<E_i<<":="<<"i"<<i_i<<" F"<<F_i<<endl;
				fprintf(output,"%s%d%s%d%s%d%s","  E",E_i,":=i",i_i," F",F_i,"\n\n");
			    E_i++;
		    	//cout<<endl;   
			    cout<<"  i"<<i_i<<":=";
				fprintf(output,"%s%d%s","  i",i_i,":=");
			    for(int i=0;i<=i3;i++)
					if(token1[n].name[i]!='\0')
					{
						cout<<token1[n].name[i];
						fprintf(output,"%c",token1[n].name[i]);
					}
			    cout<<endl;//<<endl;
				fprintf(output,"%s","\n\n");
			    i_i++;

			    re=Getsymbol();//cout<<re<<"  E"<<endl;
				if(re==4||re==3||re==2||re==1)
					F();
				else
					F(F_i);
			}
			else
				ERROR();
}

void F(int A)                               //F->+EF | -EF | *EF | /EF | ε
{
	if(re==4)
	{
		cout<<"  F"<<A<<":="<<"+ E"<<E_i;
		fprintf(output,"%s%d%s%d","  F",A,":=+ E",E_i);
		F_i++;
		L1[symbol_L1].symbol_i=F_i;//L1=F_i;
		l1=symbol_L1;
		symbol_L1++;		
		cout<<" F"<<F_i<<endl;
		fprintf(output,"%s%d%s"," F",F_i,"\n\n");
		F_i++;
		//cout<<endl;
		E();
		if(re==4||re==3||re==2||re==1)
			F();
		else
			while(l1>=0)
			{
				if(l1[L1].state==0&&L1[l1].symbol_i!=-1)
				{
					
					F(L1[l1].symbol_i);
					L1[l1].state=1;
				}
				else
				{
					l1--;
				}
			}
	}
	else
		if(re==3)
		{
			cout<<"  F"<<A<<":="<<"- E"<<E_i;
			fprintf(output,"%s%d%s%d","  F",A,":=- E",E_i);
			F_i++;
			L2[symbol_L2].symbol_i=F_i;//L2=F_i;
			l2=symbol_L2;
		    symbol_L2++;
			cout<<" F"<<F_i<<endl;
			fprintf(output,"%s%d%s"," F",F_i,"\n\n");
			F_i++;
			//cout<<endl;
			E();
			if(re==4||re==3||re==2||re==1)
				F();
			else
				while(l2>=0&&L2[l2].symbol_i!=-1)
				{
				if(L2[l2].state==0)
				{
					
					F(L2[l2].symbol_i);
					L2[l2].state=1;
				}
				else
				{
					l2--;
				}
				}
		}
		else
			if(re==2)
			{
				cout<<"  F"<<A<<":="<<"* E"<<E_i;
				fprintf(output,"%s%d%s%d","  F",A,":=* E",E_i);
				F_i++;
				L3[symbol_L3].symbol_i=F_i;//L3=F_i;
				l3=symbol_L3;
		        symbol_L3++;
				cout<<" F"<<F_i<<endl;
				fprintf(output,"%s%d%s"," F",F_i,"\n\n");
				F_i++;
				//cout<<endl;
				E();
				if(re==4||re==3||re==2||re==1)
					F();
				else
					while(l3>=0&&L3[l3].symbol_i!=-1)
				{
					if(L3[l3].state==0)
					{
						
						F(L3[l3].symbol_i);
						L3[l3].state=1;
					}
					else
					{
						l3--;
					}
				}
			}
			else
				if(re==1)
				{
					cout<<"  F"<<A<<":="<<"/ E"<<E_i;
					fprintf(output,"%s%d%s%d","  F",A,":=/ E",E_i);
					F_i++;
					L4[symbol_L4].symbol_i=F_i;//L4=F_i;
					l4=symbol_L4;
					symbol_L4++;
					cout<<" F"<<F_i<<endl;
					fprintf(output,"%s%d%s"," F",F_i,"\n\n");
				    F_i++;
				//	cout<<endl;
					E();
					if(re==4||re==3||re==2||re==1)
						F();
					else
						while(l4>=0&&L4[l4].symbol_i!=-1)
					{
						if(L4[l4].state==0)
						{
							
							F(L4[l4].symbol_i);
							L4[l4].state=1;
						}
						else
						{
							l4--;
						}
					}
				}
				else
					if(re==20)
					{
						cout<<"  F"<<A<<":=ε"<<endl;
						fprintf(output,"%s%d%s","  F",A,":=ε\n\n");
						F_i++;
						//cout<<endl;
						re=-1;					
					}
					else
					{
						cout<<"  F"<<A<<":=ε"<<endl;
						fprintf(output,"%s%d%s","  F",A,":=ε\n\n");
						if((symbol_L<=l)&&(symbol_L1<=l1)&&(symbol_L2<=l2)&&(symbol_L3<=l3)&&(symbol_L4<=l4))
								F_i++;
						//cout<<endl;
					}
}

void F()                               //F->+EF | -EF | *EF | /EF | ε
{
	if(re==4)
	{
		cout<<"  F"<<F_i<<":="<<"+ E"<<E_i;
		fprintf(output,"%s%d%s%d","  F",F_i,":=+ E",E_i);
		F_i++;
		L1[symbol_L1].symbol_i=F_i;//L1=F_i;
		l1=symbol_L1;
		symbol_L1++;		
		cout<<" F"<<F_i<<endl;
		fprintf(output,"%s%d%s"," F",F_i,"\n\n");
		F_i++;
		//cout<<endl;
		E();
		if(re==4||re==3||re==2||re==1)
			F();
		else
			while(l1>=0&&L1[l1].symbol_i!=-1)
				{
				if(L1[l1].state==0)
				{
					
					F(L1[l1].symbol_i);
					L1[l1].state=1;
				}
				else
				{
					l1--;
				}
				}
	}
	else
		if(re==3)
		{
			cout<<"  F"<<F_i<<":="<<"- E"<<E_i;
			fprintf(output,"%s%d%s%d","  F",F_i,":=- E",E_i);
			F_i++;
			L2[symbol_L2].symbol_i=F_i;//L2=F_i;
			l2=symbol_L2;
		    symbol_L2++;
			cout<<" F"<<F_i<<endl;
			fprintf(output,"%s%d%s"," F",F_i,"\n\n");
	     	F_i++;
			//cout<<endl;
			E();
			if(re==4||re==3||re==2||re==1)
				F();
			else
				while(l2>=0&&L2[l2].symbol_i!=-1)
				{
				if(L2[l2].state==0)
				{
					
					F(L2[l2].symbol_i);
					L2[l2].state=1;
				}
				else
				{
					l2--;
				}
				}
		}
		else
			if(re==2)
			{
				cout<<"  F"<<F_i<<":="<<"* E"<<E_i;
				fprintf(output,"%s%d%s%d","  F",F_i,":=* E",E_i);
				F_i++;
				L3[symbol_L3].symbol_i=F_i;//L3=F_i;
				l3=symbol_L3;
		        symbol_L3++;
				cout<<" F"<<F_i<<endl;
				fprintf(output,"%s%d%s"," F",F_i,"\n\n");
	     	    F_i++;
				//cout<<endl;
				E();
				if(re==4||re==3||re==2||re==1)
					F();
				else
					while(l3>=0&&L3[l3].symbol_i!=-1)
				{
				if(L3[l3].state==0)
				{
					
					F(L3[l3].symbol_i);
					L3[l3].state=1;
				}
				else
				{
					l3--;
				}
				}
			}
			else
				if(re==1)
				{
					cout<<"  F"<<F_i<<":="<<"/ E"<<E_i;
					fprintf(output,"%s%d%s%d","  F",F_i,":=/ E",E_i);
					F_i++;
					L4[symbol_L4].symbol_i=F_i;//L4=F_i;
					l4=symbol_L4;
					symbol_L4++;
					cout<<" F"<<F_i<<endl;
					fprintf(output,"%s%d%s"," F",F_i,"\n\n");
	     	        F_i++;
					//cout<<endl;
					E();
					if(re==4||re==3||re==2||re==1)
						F();
					else
						while(l4>=0&&L4[l4].symbol_i!=-1)
				{
				if(L4[l4].state==0)
				{
					
					F(L4[l4].symbol_i);
					L4[l4].state=1;
				}
				else
				{
					l4--;
				}
				}
				}
				else
					{
						cout<<"  F"<<F_i<<":=ε"<<endl;	
						fprintf(output,"%s%d%s","  F",F_i,":=ε");
						F_i++;
						//cout<<endl;
					}
}

void ERROR()
{
	cout<<"这个语句与该文法不符!"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -