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

📄 fenxi.cpp

📁 编译原理课程设计,语法分析.学校的课程设计,好象还有点用吧
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{	
	TOKEN token;
	token=accidence(infile,irow,1); //begin
	if(token.iType!=KEYWORD ||token.dProperty!='b')
	{
		WriteError("缺少关键字begin",token.iPosition);
		return false;
	}
	
	if(!OptionalStatements(buffer))
	{
		return false;
	}

	token=accidence(infile,irow,1); //end
	if(token.iType==KEYWORD && token.dProperty=='e')
	{
		return true;
	}

	WriteError("缺少关键字end",token.iPosition);
	return false;
}

bool OptionalStatements(char *buffer) //N
{
	TOKEN token;
	char temp[2048]={0};
	token=accidence(infile,irow,0);
	if((token.iType==DESIGNATOR) //id
		||(token.iType==KEYWORD &&
		  (token.dProperty=='b' //begin
		  ||token.dProperty=='w'//while
		  ||token.dProperty=='i'//if
		  ||token.dProperty=='x'
		  ||token.dProperty=='y')))
	{
		if(!Statement(buffer))
		{
			return false;
		}
		if(!StatementList(temp))
		{
			return false;
		}
		strcat(buffer,temp);
		return true;
	}
	else if(token.iType==KEYWORD && token.dProperty=='e') //end,N->空
	{
		return true;
	}

	WriteError("语句错误",token.iPosition);
	return false;
}

bool Statement(char *buffer) //P
{
	TOKEN token;
	int iPlace;
	int line;

	char statement[4096]={0};
	char statement1[4096]={0};
	char ex[1024]={0};
	token=accidence(infile,irow,0);

	if(token.iType==DESIGNATOR) //P → id R;
	{
		token=accidence(infile,irow,1);
		int i=GetType(token.dProperty);
		if(INVALIDETYPE>=GetType(token.dProperty))
		{
			WriteError("未声明的标识符",token.iPosition);
		}
		if(!Variable(token.dProperty,buffer))
		{
			return false;
		}
		
		token=accidence(infile,irow,1);
		if(token.iType!=KEYWORD ||token.dProperty!=';')
		{
			WriteError("缺少分号",token.iPosition);
		}

		return true;
	}
	else if(token.iType==KEYWORD)
	{
		if(token.dProperty=='b') //P->E
		{
			return CompoundStatement(buffer);
		}
		else if(token.dProperty=='i') //P-> if  S  then  P  else  P
		{
			token=accidence(infile,irow,1);
			if(!Expression(&iPlace,ex))
			{
				return false;
			}

			token=accidence(infile,irow,1); //then
			if(token.iType!=KEYWORD ||token.dProperty!='t')
			{
				WriteError("错误的if语句",token.iPosition);
				return false;
			}

			iCodeLine++;
			if(!Statement(statement))
			{
				return false;
			}
			line=iCodeLine;

			token=accidence(infile,irow,1); //else
			if(token.iType!=KEYWORD ||token.dProperty!='s')
			{
				WriteError("错误的if语句",token.iPosition);
				return false;
			}

		    if(!Statement(statement1))
			{
				return false;
			}

			sprintf(buffer,"%sif %d E 0.0 goto %d\r\n%sgoto %d\r\n%s",ex,iPlace,line+1,statement,iCodeLine+1,statement1);
			iCodeLine++;
			return true;
		}
		else if(token.dProperty=='w')// P->while  S  do  P
		{
			token=accidence(infile,irow,1);
			line=iCodeLine;
			if(!Expression(&iPlace,ex))
			{
				return false;
			}

			token=accidence(infile,irow,1);
			if(token.iType!=KEYWORD ||token.dProperty!='d')
			{
				WriteError("错误的循环语句",token.iPosition);
				return false;
			}
			
			iCodeLine++;
			if(!Statement(statement))
			{
				return false;
			}

			sprintf(buffer,"%sif %d E 0.0 goto %d\r\n%sgoto %d\r\n",ex,iPlace,iCodeLine+1,statement,line);
			iCodeLine+=1;
			return true;
		}
		else if(token.dProperty=='x'||token.dProperty=='y') //P->read(id) 或P->write(id)
		{
			token=accidence(infile,irow,1);
			
			char property=token.dProperty;
			token=accidence(infile,irow,1);//(
			if(token.iType!=KEYWORD ||token.dProperty!='(')
			{
				WriteError("非法的函数调用",token.iPosition);
				return false;
			}
			buffer[0]=0;
			while(1)
			{
				token=accidence(infile,irow,1);//id
				int pos=token.dProperty;
				if(token.iType!=DESIGNATOR)
				{
					WriteError("非法的函数调用",token.iPosition);
					return false;
				}
				
				token=accidence(infile,irow,1); //)或,[
				if(token.iType==KEYWORD && token.dProperty=='[')
				{
				    int lable;
					
					if(!Expression(&lable,statement))
					{	
						return false;
					}
					if(lable<table.getDimension(pos))
					{
						WriteError("数组下界越界",token.iPosition);
					}
					strcat(buffer,statement);

					int temp=Insert(INTEGER,2);
					if(property=='x')
					{
						sprintf(statement,"%d = %d.0\r\n%d = %d - %d\r\nparam %d[%d]\r\ncall read\r\n"
							,temp,table.getDimension(pos),temp,temp,lable,pos,temp);
					}
					else if(property=='y')
					{
							sprintf(statement,"%d = %d.0\r\n%d = %d - %d\r\nparam %d[%d]\r\ncall write\r\n"
							,temp,table.getDimension(pos),temp,temp,lable,pos,temp);
					}
					iCodeLine+=4;
					strcat(buffer,statement);
					token=accidence(infile,irow,1);
					if(token.iType==KEYWORD &&token.dProperty==']')
					{
						WriteError("错误的数组引用",token.iPosition);
					}
					token=accidence(infile,irow,1);
				}
				else
				{
					if(property=='x')
					{
						sprintf(statement,"param %d\r\ncall read\r\n",pos);
					}
					else if(property=='y')
					{
						sprintf(statement,"param %d\r\ncall write\r\n",pos);
					}
					strcat(buffer,statement);
					iCodeLine+=2;
				}
				//token=accidence(infile,irow,1); //)或,[
				if(token.iType==KEYWORD &&token.dProperty==',')
				{
					continue;
				}
				else if(token.iType==KEYWORD && token.dProperty==')')
				{
					break;
				}
				else
				{
					WriteError("非法的函数调用,缺少')'",token.iPosition);
					return false;
				}
			}
			token=accidence(infile,irow,1);  //;
			if(token.iType!=KEYWORD ||token.dProperty!=';')
			{
				WriteError("错误的表达式,缺少';'",token.iPosition);
			}

			return true;
		}

		WriteError("非法的关键字",token.iPosition);
		return false;
	}
	else if(token.iType==KEYWORD && token.dProperty=='e')
	{
		return true;
	}

	WriteError("错误的表达式",token.iPosition);
	return false;
}

bool StatementList(char* buffer) //Q
{
	TOKEN token;
	char temp[2048]={0};
	token=accidence(infile,irow,0);
	if(token.iType==KEYWORD)
	{
		if(token.dProperty=='e') //Q->空
		{
			return true;
		}
    	if(token.dProperty=='i'||token.dProperty=='w'||token.dProperty=='b'
			||token.dProperty=='x'||token.dProperty=='y')
		{
			token.iType=DESIGNATOR;
		}
	}
	if(token.iType==DESIGNATOR) //Q→P Q 
	{
		//token=accidence(infile,irow,1);
		if(!Statement(buffer))
		{
			return false;
		}

		if(!StatementList(temp))
		{
			return false;
		}
		strcat(buffer,temp);
		return true;
	}

	WriteError("错误的表达式",token.iPosition);
	return false;
}
/**/
bool Variable(int iPlace,char *buffer)//R
{
	TOKEN token;
	char ex[1024]={0};
	char ex1[1024]={0};
	char temp[100]={0};
	int place,subplace;
	int Argument[10],num=0;
	token=accidence(infile,irow,0);
	if(token.iType==KEYWORD)
	{
		if(token.dProperty=='e' ||token.dProperty==';')//R->空
		{ 
			if(GetType(iPlace)==PROC) //过程
			{
				sprintf(buffer,"call %d\r\n",iPlace);
			}
			else
			{
				sprintf(buffer,"%d\r\n",iPlace);
			}
//			WriteCode(buffer);
			iCodeLine++;
			return true;
		}
		else if(token.dProperty=='[')//R→[ S] assignop  S
		{
			token=accidence(infile,irow,1);

			if(!Expression(&subplace,ex))
			{
				return false;
			}

			token=accidence(infile,irow,1);
			if(token.iType!=KEYWORD ||token.dProperty!=']')
			{
				WriteError("错误的赋值语句",token.iPosition);
				return false;
			}
			token=accidence(infile,irow,1);
			if(token.iType!=ASSIGN_OP)
			{
				WriteError("错误的赋值语句",token.iPosition);
				return false;
			}
			if(!Expression(&place,ex1))
			{
				return false;
			}

			sprintf(buffer,"%s%s%d[%d] = %d\r\n",ex,ex1,iPlace,subplace,place);
//			WriteCode(buffer);
			iCodeLine++;
			if(GetType(iPlace)!=GetType(place)+2)
			{
				WriteError("类型不匹配",token.iPosition);
			}
			return true;
		}
		else if(token.dProperty=='(')//R->(SU)
		{//yjl
			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;
		}
	}
	else if(token.iType==2) //R->assign S
	{
		token=accidence(infile,irow,1);
		if(!Expression(&place,ex))
		{
			return false;
		}
		sprintf(buffer,"%s%d = %d\r\n",ex,iPlace,place);
		iCodeLine++;
		if(GetType(iPlace)!=GetType(place))
		{
			WriteError("类型不匹配",token.iPosition);
		}
		return true;
	}

	WriteError("错误的赋值语句",token.iPosition);
	return false;
}

bool Expression(int *iPlace,char *buffer) //S
{
	int place;
	char se[1024]={0};
	char ex[1024]={0};
	if(!SimpleExpression(&place,se))
	{
		return false;
	}
	
	if(!Expression1(&place,ex))
	{
		return false;
	}
	sprintf(buffer,"%s%s",se,ex);
	*iPlace=place;
	return true;
}
/**/
bool ExpressionList(int *iPlace,int * num,char *buffer) //U
{
	TOKEN token;
	char ex[512]={0};
	char exlst[512]={0};
	token=accidence(infile,irow,0);
	if(token.iType==KEYWORD && token.dProperty==',') //U->,SU
	{
		token=accidence(infile,irow,1);
		if(!Expression(iPlace+(*num),ex))
		{
			return false;
		}
		(*num)++;
		if(!ExpressionList(iPlace,num,exlst))
		{
			return false;
		}

		sprintf(buffer,"%s%s",ex,exlst);
		return true;
	}
	return true;
}

bool Expression1(int *iPlace,char *buffer) //W
{
	TOKEN token;
	int place,temp;
	char se[1024]={0};

	token=accidence(infile,irow,0);
	if(token.iType==RELOP) //W->relop  V
	{
		token=accidence(infile,irow,1);
		if(!SimpleExpression(&place,se))
		{
			return false;
		}
		if(GetType(*iPlace)!=GetType(place))
		{
			WriteError("类型不匹配",token.iPosition);
		}
		temp=Insert(BOOL,2);
		sprintf(buffer,"%sif %d %c %d goto %d\r\n%d = 0.0\r\ngoto %d\r\n %d = 1.0\r\n"
					   ,se,*iPlace,(char)token.dProperty,place,iCodeLine+3,temp,iCodeLine+4,temp);

//		WriteCode(buffer);
		iCodeLine+=4;
		*iPlace=temp;

		return true;
	}
	else if(token.iType==KEYWORD &&(token.dProperty==',' ||token.dProperty==')')) //W->空
	{
		return true;
	}

	return true;
}
/**/
bool SimpleExpression(int *iPlace,char *buffer)//V
{
	TOKEN token;
	int place=0,temp;
	token=accidence(infile,irow,0);
	char factor[512]={0};
	char term[512]={0};
	char se[512]={0};
	if(token.iType==ADD_OP &&(token.dProperty=='+' ||token.dProperty=='-'))
	{
		token=accidence(infile,irow,1);
	}
	if(!Factor(&place,factor))
	{
		return false;
	}
	if(!Term(&place,term))
	{
		return false;
	}
	if(!SimpleExpression1(&place,se))
	{
		return false;
	}

	if(token.iType==ADD_OP &&(token.dProperty=='-'))
	{
		temp=Insert(GetType(place),2);
		sprintf(buffer,"%s%s%s%d = - %d\r\n",factor,term,se,temp,place);
		iCodeLine++;
		*iPlace=temp;
	}
	else
	{
		temp=Insert(GetType(place),2);
		sprintf(buffer,"%s%s%s%d = %d\r\n",factor,term,se,temp,place);
		iCodeLine++;
		*iPlace=temp;
	}
	return true;
}

bool Factor(int *iPlace,char *buffer) //Z
{
	TOKEN token;
	int place=-1,temp;
	char factor[1024]={0};

	token=accidence(infile,irow,1);
	if(token.iType==DESIGNATOR) //Z->idX
	{
	    int i=GetType(token.dProperty);
	    if(INVALIDETYPE>=GetType(token.dProperty))
		{
			WriteError("未声明的标识符",token.iPosition);
		}
		place=token.dProperty;
		if(!Factor1(&place,buffer))
		{
			return false;
		}
		if(place!=-1)
		{
			*iPlace=place;
		}
		else
		{
			*iPlace=token.dProperty;
		}
		return true;
	}
	else if(token.iType==NUM)
	{
		place=Insert(REAL,REALWIDTH);
		
		sprintf(buffer,"%d = %f\r\n",place,token.dProperty);
//		WriteCode(buffer);
		*iPlace=place;
		iCodeLine++;
		return true;
	}
	else if(token.iType==KEYWORD && token.dProperty=='(') //Z->(  S  )  
	{
		if(!Expression(&place,buffer))	
		{
			return false;
		}
		token=accidence(infile,irow,1);
		if(token.iType!=KEYWORD ||token.dProperty!=')')
		{
			WriteError("缺少')'",token.iPosition);
			return false;
		}
		*iPlace=place;
		return true;
	}
	else if(token.iType==KEYWORD && token.dProperty=='!')
	{
		if(!Factor(&place,factor))
		{
			return false;
		}
		
		temp=Insert(BOOL,2);

		sprintf(buffer,"%s%d = ! %d\r\n",factor,temp,place);
//		WriteCode(buffer);
		iCodeLine++;

		*iPlace=temp;
		return true;
	}

	WriteError("错误的赋值语句",token.iPosition);
	return false;
}
/**/

⌨️ 快捷键说明

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