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

📄 fenxi.cpp

📁 编译原理课程设计,语法分析.学校的课程设计,好象还有点用吧
💻 CPP
📖 第 1 页 / 共 3 页
字号:
bool Factor1(int *iPlace,char*buffer) //X
{
	TOKEN token;
	char ex[1024]={0};
	char ex1[1024]={0};
	char temp[100]={0};
	int Argument[10],num=0;

	token=accidence(infile,irow,0);
	if(token.iType==KEYWORD &&token.dProperty=='(')
	{
		token=accidence(infile,irow,1);
		if(!Expression(Argument,ex))
		{
				return false;
		}
		num++;
		if(!ExpressionList(Argument,&num,ex1))
		{
			return false;
		}
		token=accidence(infile,irow,1);
		if(token.iType!=KEYWORD || token.dProperty!=')')
		{
			WriteError("缺少')'",token.iPosition);
		}
		sprintf(buffer,"%s%s",ex,ex1);
		for(int i=0;i<num;i++)
		{
			if(GetType(Argument[i])!=GetType(table.getParam(*iPlace,i)))
			{
				WriteError("类型不匹配",token.iPosition);
			}
			sprintf(temp,"param %d\r\n",Argument[i]);
			strcat(buffer,temp);
		}
		sprintf(temp,"call %d\r\n",*iPlace);
		strcat(buffer,temp);
		iCodeLine+=num+1;
		return true;
	}

	return true;
}

bool Term(int *iPlace,char *buffer) //T
{
	TOKEN token;
	int place,temp;
	char factor[1024]={0};
	char term[1024]={0};

	token=accidence(infile,irow,0);
	if(token.iType==MUL_OP)
	{
		token=accidence(infile,irow,1);

		if(!Factor(&place,factor))
		{
			return false;
		}
		
		if(GetType(*iPlace)!=GetType(place))
		{
			WriteError("类型不匹配",token.iPosition);
		}
		if(token.dProperty=='*' ||token.dProperty=='/')
		{
			temp=Insert(GetType(*iPlace),2);
	
			if(GetType(*iPlace)>GetType(place))
			{
				temp=Insert(GetType(*iPlace),2);
			}
			else
			{
				temp=Insert(GetType(place),2);
			}
		}
		else
		{
			temp=Insert(BOOL,2);
		}
		
		sprintf(buffer,"%s%d = %d %c %d\r\n",factor,temp,*iPlace,(char)token.dProperty,place);
		iCodeLine++;

		if(!Term(&temp,term))
		{
			return false;
		}
		*iPlace=temp;
		strcat(buffer,term);
	}

	return true;
}

bool SimpleExpression1(int *iPlace,char *buffer)//Y
{
	TOKEN token;
	char factor[512]={0};
	char term[512]={0};
	char se[1024]={0};
	int temp,place;

	token=accidence(infile,irow,0);
	if(token.iType==ADD_OP)
	{
		token=accidence(infile,irow,1);
		if(!Factor(&place,factor))
		{
			return false;
		}
		if(!Term(&place,term))
		{
			return false;
		}
		
		if(GetType(*iPlace)!=GetType(place))
		{
			WriteError("类型不匹配",token.iPosition);
		}
		if(GetType(*iPlace)>GetType(place))
		{
			temp=Insert(GetType(*iPlace),2);
		}
		else
		{
			temp=Insert(GetType(place),2);
		}

		sprintf(buffer,"%s%s%d = %d %c %d\r\n",factor,term,temp,*iPlace,(char)token.dProperty,place);
		iCodeLine++;
		if(!SimpleExpression1(&temp,se))
		{
			return false;
		}
		*iPlace=temp;
		strcat(buffer,se);
	}

	return true;
}

//记录错误,参数为错误信息,出错行号
void WriteError(char* strErr,int iLine) 
{
	FILE *pFile;
	char buffer[1024]={0};
	pFile=fopen("Error.txt","a"); //打开文件
	if(pFile==NULL)
	{
		return;
	}

	//写入错误记录文件
	if(!strcmp(strErr,"编译成功"))
	{
		sprintf(buffer,"----%s\r\n",strErr);
	}
	else
	{
		sprintf(buffer,"----Error at Line%d:%s\r\n",iLine,strErr);
	}

	fwrite(buffer,1,strlen(buffer),pFile);
	
	fclose(pFile);
}

void WriteCode(char *cCode)  //写入三地址代码
{
	FILE *pFile;
	pFile=fopen("Code.txt","a");
	if(pFile==NULL)
	{
		return;
	}

	fwrite(cCode,1,strlen(cCode),pFile);
	fclose(pFile);
}

//查找关键字
char KeyWordSearch(char* ca)
{
	for(int i=0;i<23;i++)
	{
		int ret=strcmp(ca,key_table[i].cName);//判断ca是否为保留字
		if(ret==0)
			return key_table[i].cReturnName;//ca是保留字,返回保留字缩写字符
	}
	return '0';//ca不是保留字
}

//清除注释
int Clearzhushi(ifstream &infile)
{
	char ca;
	int i=1;
    while(i!=0)
	{
		if(!infile.eof())
			infile.read(&ca,1);
		else
			return 0;
		if(ca=='{')
			i++;
		else if(ca=='}')
			i--;
	}
	return 1;
}

//词法分析,infile为文件流,irow为当前行号,flag为标志(判断文件流指针是否前进)
TOKEN accidence(ifstream &infile,int &irow,int flag)
{
	char ca;
	TOKEN token;
	streampos spos=infile.tellg();
	int ih=irow;
	token.iPosition=irow;
	while(!infile.eof())
	{
	    infile.read(&ca,1);
		if(ca==' '||ca==9||ca==13)//读到' ',tab,\r
			continue;
		else if(ca=='\n')//读到\n
		{
			irow++;
			token.iPosition=irow;
		}
		else if((48<=ca)&&(ca<=57))//读到常数
		{
			int i=0;
			float f=0;
			bool b=true;
			while(1)
			{
				i=i*10+ca-48;
				ca=infile.peek();
				while(ca=='{')
				{
					infile.read(&ca,1);
				    if(!Clearzhushi(infile))
					{
						token.iType=-1;
						if(!flag)
						{
							infile.seekg(spos);
							irow=ih;
						}
						return token;
					}
				    ca=infile.peek();
				}
				if((48<=ca)&&(ca<=57))
					infile.read(&ca,1);
				else if(ca=='.')
				{
					infile.read(&ca,1);
					ca=infile.peek();
					if(ca=='.')
					{
						infile.putback(ca);
						break;
					}
					else if((48<=ca)&&(ca<=57))
					{
						infile.read(&ca,1);
						float fi=1;
						while(1)
						{
							fi/=10;
							f+=(ca-48)*fi;
						    ca=infile.peek();
							while(ca=='{')
							{
								infile.read(&ca,1);
								if(!Clearzhushi(infile))
								{
									token.iType=-1;
								    if(!flag)
									{
										infile.seekg(spos);
							            irow=ih;
									} 
						            return token;
								}
								ca=infile.peek();
							}
                            if((48<=ca)&&(ca<=57))
								infile.read(&ca,1);
						    else
								break;
						}
						break;
					}
					else
						break;
				}
				else
					break;
			}
			token.iType=5;
			token.dProperty=i+f;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if((65<=ca)&&(ca<=90)||(97<=ca)&&(ca<=122))//读到标识符,及关键字
		{
			char cid[leng];
			int i=0;
			while(1)
			{
				cid[i++]=ca;
				ca=infile.peek();
				while(ca=='{')
				{
					infile.read(&ca,1);
				    if(!Clearzhushi(infile))
					{
						token.iType=-1;
						if(!flag)
						{
							infile.seekg(spos);
							irow=ih;
						}
						return token;
					}
				    ca=infile.peek();
				}
				if((65<=ca)&&(ca<=90)||(97<=ca)&&(ca<=122)||(48<=ca)&&(ca<=57))
					infile.read(&ca,1);
				else
					break;
			}
			cid[i]=0;
			char cb=KeyWordSearch(cid);
			if(cb=='0')//读到标识符
			{
				token.iType=1;
				token.dProperty=table.insert(cid);
			    //cout<<cid<<" "<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			    if(!flag)
				{
					infile.seekg(spos);
					irow=ih;
				}
				return token;
			}
			else if(cb=='|')//读到or
			{
				token.iType=3;
				token.dProperty=cb;
			    //cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			    if(!flag)
				{
					infile.seekg(spos);
					irow=ih;
				}
				return token;
			}
			else if(cb=='g'||cb=='m'||cb=='&')//读到div,mod,and
			{
				token.iType=4;
				token.dProperty=cb;
			    //cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			    if(!flag)
				{
					infile.seekg(spos);
					irow=ih;
				}
				return token;
			}
			else//读到其他关键字
			{
				token.iType=0;
				token.dProperty=cb;
			    //cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			    if(!flag)
				{
					infile.clear();
					infile.seekg(spos);
					irow=ih;
				}
				return token;
			}
		}
		else if(ca=='+'||ca=='-')//读到+,-
		{
			token.iType=3;
			token.dProperty=ca;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca=='*'||ca=='/')//读到*,/
		{
			token.iType=4;
			token.dProperty=ca;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca==';'||ca=='('||ca==')'||ca=='['||ca==']'||ca==',')//读到;,(,),[,]及,
		{
			token.iType=0;
			token.dProperty=ca;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca=='.')//读到..
		{
			char cb=infile.peek();
			while(cb=='{')
			{
				infile.read(&ca,1);
				if(!Clearzhushi(infile))
				{
					token.iType=-1;
					if(!flag)
					{
						infile.seekg(spos);
						irow=ih;
					}
					return token;
				}
				cb=infile.peek();
			}
			if(cb=='.')
			{
				infile.read(&ca,1);
				token.iType=0;
				token.dProperty=cb;
			}
			else  
				token.iType=-1;	
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca=='<')//读到<,<=,<>
		{
			token.iType=6;
			char cb=infile.peek();
			while(cb=='{')
			{
				infile.read(&ca,1);
				if(!Clearzhushi(infile))
				{
					token.iType=-1;
					if(!flag)
					{
						infile.seekg(spos);
						irow=ih;
					}
					return token;
				}
				cb=infile.peek();
			}
			if(cb=='='||cb=='>')
			{
				infile.read(&ca,1);
				if(cb=='=')
					token.dProperty='L';
				else
					token.dProperty='X';
			}
			else
				token.dProperty=ca;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca=='>')//读到>,>=
		{
			token.iType=6;
			char cb=infile.peek();
			while(cb=='{')
			{
				infile.read(&ca,1);
				if(!Clearzhushi(infile))
				{
					token.iType=-1;
					if(!flag)
					{
						infile.seekg(spos);
						irow=ih;
					}
					return token;
				}
				cb=infile.peek();
			}
			if(cb=='=')
			{
				infile.read(&ca,1);
				token.dProperty='G';
			}
			else
				token.dProperty=ca;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
			    irow=ih;
			}
			return token;
		}
		else if(ca=='=')//读到=
		{
			token.iType=6;
			token.dProperty='E';
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca==':')//读到:=
		{
			char cb=infile.peek();
			while(cb=='{')
			{
				infile.read(&ca,1);
				if(!Clearzhushi(infile))
				{
					token.iType=-1;
					if(!flag)
					{
						infile.seekg(spos);
						irow=ih;
					}
					return token;
				}
				cb=infile.peek();
			}
			if(cb=='=')
			{
				infile.read(&ca,1);
				token.iType=2;
			}
			else  
			{
				token.iType=0;
				token.dProperty=ca;
			}
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
		else if(ca=='{')//读到{
		{
			if(!Clearzhushi(infile))
			{
				token.iType=-1;
				return token;
			}
		}
		else
		{
			token.iType=-1;
			//cout<<token.iType<<"  "<<token.dProperty<<"   "<<token.iPosition<<'\n';
			if(!flag)
			{
				infile.seekg(spos);
				irow=ih;
			}
			return token;
		}
	}
	if(!flag)
	{
		infile.seekg(spos);
		irow=ih;
	}
	return token;
}

⌨️ 快捷键说明

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