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

📄 mycompiler.cpp

📁 类似vc的集成开发环境
💻 CPP
📖 第 1 页 / 共 5 页
字号:

void MyCompiler::statement(MyCompiler::node *fsys) //fsys为语句结束符
{
	int i,cx1,cx2,m,n;
	char *tempset1[]={"semicolon",NULL};  //;
	char *tempset4[]={"rparen",NULL};  //)
	char *tempset6[]={"over",NULL};  

	node *temp1,*temp4,*temp6;
	temp1=new node;
	temp4=new node;
	temp6=new node;

	m=0;
	n=0;
	while(tempset1[m]!=NULL)
		temp1->pa[n++]=tempset1[m++];
	temp1->pa[n]=NULL;

	m=0;
	n=0;
	while(tempset4[m]!=NULL)
		temp4->pa[n++]=tempset4[m++];
	temp4->pa[n]=NULL;

	m=0;
	n=0;
	while(tempset6[m]!=NULL)
		temp6->pa[n++]=tempset6[m++];
	temp6->pa[n]=NULL;

	m=0;
	n=0;
	if(strcmp(sym,"ident")==0)//语句首是标识符
	{
		i=position(id);
		if(i==0)
		{
			error(11);
			while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
				getsym();
		}
		else//标识符已经申明
		{
			if(in(IdentTable[i].kind,declbegsys))//标识符的类型是int,long,char,array
			{
				
				
				if(strcmp(IdentTable[i].kind,"array")==0)
						{
					    
					     int i_elementno=1;
						 int i_arrayadr=IdentTable[i].val;

					     int i_elementcount=ArrayTable[IdentTable[i].val].count;
						 int i_arrayindex=ArrayTable[IdentTable[i].val].i_startadr;
					     int i_count=0;//元素相对于数组起始位置的位移
						 int i_longflag=0;//数组地址是否long
						 getsym();
						 if(strcmp(sym,"lsquarebrackets")!=0)
					       error(29);
						 gen("lit",0,0,line);
					     while(strcmp(sym,"lsquarebrackets")==0)//标识符的类型是array
						 {
							i_elementno++;
							i_count=1;
							getsym();    //某一维大小num
							int expression_typearray=expression(fsys);
							
							for(int i=i_elementno;i<=i_elementcount;i++)
					              i_count=i_count*(ArrayTable[i_arrayadr].elementsize[i]);
					  
							//i_count=i_count*IdentTable[i].val;
							int  i_backkindsize=1;
							if(IdentTable[i].kind=="long")
								i_backkindsize=2;
							i_count=i_count*i_backkindsize;
							gen("lit",0,i_count,line);
							if(expression_typearray==4&&i_longflag==0)  //
							{
								//gen("opr",1,4,line);  //int*long
								//i_longflag=1;
								error(41);
							}
							else
								if(expression_typearray==4&&i_longflag==1) //long*long
									//gen("opr",0,4,line); 
									error(41);
								else
									if(i_longflag==0)   //int*int
									  gen("opr",0,4,line);  
									else
										error(41);
							gen("opr",0,2,line);   //
							//getsym(); 
						    if(strcmp(sym,"rsquarebrackets")!=0)
								error(26);
							
								

						   }
				    
						  i_arrayindex=i_arrayindex+i_count;
						 
						
						if(strcmp("long",IdentTable[i].BackKind)==0)  //数组,long 类型
						{
							gen("lit",0,2,line);   //2*index
							gen("opr",0,4,line);  //int*int							
						}

						 //将常量方到栈顶
						gen("lit",IdentTable[i].level,IdentTable[i].adr,line);
						gen("opr",0,2,line); //int+int


						
					    //ArrayTable[i_arrayadr].i_elementindex++;
					    //ArrayTable[i_arrayadr].arrayadr[ArrayTable[i_arrayadr].i_elementindex]=i_arrayindex;
						//IdentTable[i].val=i_arrayindex;

				        i_isarray=3;  //数组结束前的处理

//						getsym(); 
//						  if(strcmp(sym,"rsquarebrackets")!=0)
//					       error(26);
					}
				getsym();


				if(strcmp(sym,"becomes")!=0)
				{
								//此处为单操作数语句
					error(93);
					while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
						getsym();
				}					
				else           //此处是赋值表达式语句翻译
				{
					getsym();   //变量名
					if(strcmp(sym,"ident")==0)//=后是标识符
					{
						int i1=position(id);
						if(i1==0)
						{
							error(11);
							while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
								getsym();
						}
						else  //函数值赋与标示符
						{
							if(strcmp(IdentTable[i1].kind,"function")==0)
							{     //函数返回值的数据类型           //等号前面的标志符的数据类型
								if(IdentTable[i1].BackKind=="long"&&IdentTable[i].kind=="int"
									||IdentTable[i1].BackKind=="long"&&IdentTable[i].BackKind=="int")//(strcmp(IdentTable[i1].BackKind,IdentTable[i].kind)!=0)
								{
									error(94);
									while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
										getsym();
								}
								else
								{
									verify(fsys);//验证函数的参数合法
									getsym();   //
									if(IdentTable[i1].adrtrue==0)  //子函数入口地址没有确定
									{
										int k;

										k=IdentTable[i1].adr;
										IdentTable[i1].adr=cx;  //纪录回填行地址
										gen("gosub",0,k,line);
						
									}
									else
									{
										gen("gosub",0,IdentTable[i1].adr,line);
									}

									gen("substo",IdentTable[i].level,IdentTable[i].adr,line);
									if(strcmp("long",IdentTable[i].kind)==0
										||strcmp("long",IdentTable[i].BackKind)==0) //数组
										gen("substo",IdentTable[i].level,IdentTable[i].adr-1,line);
								}

							
							}  //不是函数
							else//表达式值赋与标示符
							{
								int expression_type=expression(fsys);


								if(IdentTable[i].kind=="array")
								{
									//gen("stoex",0,0,line);
									if(strcmp("long",IdentTable[i].BackKind)==0)  //数组
									{
										if(expression_type==4)//long
										{
											gen("stoex",0,2,line); //long store to long
										}
										else
										{
											//if(expression_type==0) //int store to long
											//{
												//gen("lit",0,0,line);
												gen("stoex",0,1,line);
											//}	
										
										}
									}
									else  //int,char array
									{
										if(expression_type!=4)//int
										{
											gen("stoex",0,0,line); //int store to int
										}
										else
												error(94);

									}
								}
								else
								{
									gen("sto",IdentTable[i].level,IdentTable[i].adr,line);
									if(strcmp("long",IdentTable[i].kind)==0)
								
									{
										if(expression_type==4)
										{   //将栈顶内容送入某变量单元中
											gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
										}
										else
										{
											if(expression_type==0||expression_type==1)
											{
											gen("lit",0,0,line);
											gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
											}
											else
											{										
											     error(94);
											}
										}
									}
									if((strcmp("int",IdentTable[i].kind)==0)&&(expression_type==4))
										error(94);
								}
								//if((strcmp("int",IdentTable[i].kind)==0)&&(expression_type==4))
								//	error(94);
							}
						}					
					}
					else  //=后不是标志符
					{
						int expression_type=expression(fsys);

						gen("sto",IdentTable[i].level,IdentTable[i].adr,line);
						if(strcmp("long",IdentTable[i].kind)==0
							||strcmp("long",IdentTable[i].BackKind)==0)
						{
							if(expression_type==4)
							{
								gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
							}
							else
							{
								if(expression_type==0||expression_type==1)
								{
									gen("lit",0,0,line);
									gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
								}
								else
								{
									error(94);
								}
							}
						}
						if((strcmp("int",IdentTable[i].kind)==0)&&(expression_type==4))
							error(94);
					}
				}				
			}
			else//标识符的类型不是int,long,char,array
				if(strcmp(IdentTable[i].kind,"function")==0)//函数调用
				{
					verify(fsys);
					getsym();
					if(IdentTable[i].adrtrue==0)
					{
						int k;
						k=IdentTable[i].adr;
						IdentTable[i].adr=cx;
						gen("gosub",0,k,line);
						
					}
					else
					{
                        gen("gosub",0,IdentTable[i].adr,line);
					}
				}
				
		}
		
	}
	else//语句首不是标识符
		if(strcmp(sym,"lbigparen")==0)//复合语句
		{
			getsym(); 

			while(in(sym,add(temp1,statbegsys))==1)
			{
				statement(fsys);
				if(strcmp(sym,"semicolon")==0)
				{
					getsym();
				}
				else   
				{
					error(10);
				}
				
			}

			if(strcmp(sym,"rbigparen")==0)
			{
				//printf("  **}**  \n");
				strcpy(sym,"semicolon");
			}
			else
			{
				error(73);
				while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
					getsym();
				

			}
		}
		else
			if(strcmp(sym,"if")==0)//if语句编译
			{
				getsym();
				if(strcmp(sym,"lparen")==0)
				{
					getsym();
					condition(temp4);
					if(strcmp(sym,"rparen")==0)
					{
						getsym();
					}
					else
					{
						error(162);
					}
					cx1=cx;
					gen("jpc",0,0,line);
					statement(fsys);
					gen("goto",0,cx+1,line);
					code[cx1].a=cx;
				}
				else
				{
					error(72);
					while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
						getsym();
				}
			}
			else				
				if(strcmp(sym,"else")==0)
				{
					getsym();
					if((strcmp(code[cx-1].operation,"goto")==0)&&(code[cx-1].a==cx))
					{
						cx1=cx;
						statement(fsys);
						code[cx1-1].a=cx;
					}
					else
					{
						error(21);
						while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
							getsym();
					}

				}
				else
					if(strcmp(sym,"while")==0)
					{
						cx1=cx;
						getsym();
						if(strcmp(sym,"lparen")==0)
						{
							getsym();
							condition(temp4);
							cx2=cx;
							gen("jpc",0,0,line);
							if(strcmp(sym,"rparen")==0)
								getsym();
							else
								error(18);
							statement(fsys);
							gen("jmp",0,cx1,line);
							code[cx2].a=cx;
						}
						else
						{
							error(164);
						}
					}
					else
						if(strcmp(sym,"return")==0)
						{
							getsym();
							int return_type=expression(fsys);
							
							gen("return",0,3,line);
							if(return_type==4)
								gen("return",0,2,line);

							if(return_type==-1)
								error(201);										
						}
						else
							if(strcmp(sym,"for")==0)
							{						
								getsym();
								if(strcmp(sym,"lparen")==0)
								{
									getsym();
									if(strcmp(sym,"semicolon")!=0)
										statement(fsys);
									getsym();
									cx1=cx;
									condition(temp1);
									getsym();
									cx2=cx;
									gen("jpc",0,0,line);
									gen("jmp",0,0,line);
									int line1=line;
									if(strcmp(sym,"rparen")!=0)
										statement(temp4);
									if(strcmp(sym,"rparen")==0)
										getsym();
									else
										error(18);
									gen("jmp",0,cx1,line1);
									code[cx2+1].a=cx;
									statement(fsys);
									gen("jmp",0,cx2+2,line);
									code[cx2].a=cx;
								}
								else
								{
									error(165);
								}
							}
							else
								if(strcmp(sym,"do")==0)
								{
									cx1=cx;
									getsym();
									statement(fsys);
									getsym();
									if(strcmp(sym,"while")==0)
									{
										getsym();
					
										if(strcmp(sym,"lparen")==0)
										{
											getsym();
											condition(temp4);
											getsym();
											gen("jfc",0,cx1,line);
										}
										else
										{
											error(24);
										}
									}
									else
									{
										error(23);
									}
								}
	test(fsys,temp6,33);

	delete temp1;
	delete temp4;
	delete temp6;


}



int MyCompiler::verify(MyCompiler::node *fsys)//验证函数的参数合法
{
	int i=0,j;
	struct param *param1;

	while((strcmp(subparam[i].kind,id)!=0)&&(i<subcount))
		i++;

	getsym();  //(

	if(subcount>i)  //子函数有形式参数
	{
		param1=subparam[i].p;

		getsym();
		while((param1!=NULL)&&(strcmp(sym,"rparen")!=0))
		{
			if(strcmp(sym,"number")==0)  //实参是立即值
			{
				if(strcmp(param1->kind,"long")==0)
				{
					gen("lit",0,0,line);
				}
				gen("lit",0,num,line);
			}
			else
			{

				j=position(id);

				if(j==0)
				{
					error(11);
				}
				else
				{
						if(strcmp(IdentTable[i].kind,"array")==0)
					{
					    
					     int i_elementno=1;
						 int i_arrayadr=IdentTable[i].val;
						 int i_elementcount=ArrayTable[IdentTable[i].val].count;
					     int i_count=0;//元素相对于数组起始位置的位移
						 int i_longflag=0;//数组地址是否long
						 getsym();
						 if(strcmp(sym,"lsquarebrackets")!=0)
					       error(29);
						 gen("lit",0,0,line);
					     while(strcmp(sym,"lsquarebrackets")==0)//标识符的类型是array
						 {
							i_elementno++;
							i_count=1;
							getsym();    //某一维大小num
							//gen("lit",0,num,line);
							int expression_typearray=expression(fsys);
							
							for(int i=i_elementno;i<=i_elementcount;i++)
					              i_count=i_count*(ArrayTable[i_arrayadr].elementsize[i]);
							gen("lit",0,i_count,line);
							//i_count=i_count*IdentTable[i].val;
							if(expression_typearray==4&&i_longflag==0)  //
							{
								//gen("opr",1,4,line);  //int*long
								//i_longflag=1;
								error(41);
							}
							else
								if(expression_typearray==4&&i_longflag==1) //long*long
									//gen("opr",0,4,line); 
									error(41);
								else
									if(i_longflag==0)   //int*int
									  gen("opr",0,4,line);  
									else
										error(41);
										//gen("opr",0,4,line);  //long *int
							//getsym(); 
							gen("opr",0,2,line);   //
						    if(strcmp(sym,"rsquarebrackets")!=0) 
								error(26);
							getsym(); 
								

						}
				    
						//i_arrayindex=i_arrayindex+i_count;
	
						if(strcmp("long",IdentTable[i].BackKind)==0)  //数组,long 类型
						{
							gen("lit",0,2,line);   //2*index
							gen("opr",0,4,line);  //int*int							
						}
						 //将常量方到栈顶
						gen("lit",IdentTable[i].level,IdentTable[i].adr,line);

						gen("opr",0,2,line);

						//gen("stoex",IdentTable[i].level,0,line);
						if(strcmp("long",IdentTable[i].BackKind)==0)  //数组

⌨️ 快捷键说明

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