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

📄 pll.h

📁 实现pl0编译 能够实现简单的编译 满足编译原理的要求
💻 H
📖 第 1 页 / 共 4 页
字号:
	case constant:
		//const
		if(num>amax||(int)fnum>amax)
		{
			//address over flow
			printerr(24);//
			num=0;
		}
		if(t==integer)
		{
			table[(*ptx)].val_int=num;
			
		}
		if(t==plchar)
		{
			table[(*ptx)].c=char_buffer;
		//	printf("filltable :the char_buffer is :%c\n",table[(*ptx)].c);
		
		}
		if(t==string)
		{
			strcpy(&(table[(*ptx)].string[0]),&string_buffer[0]);
		}
		if(t==real)
			table[(*ptx)].val_real=fnum;
		break;
	case var:
		table[(*ptx)].level=lev;//the level
		table[(*ptx)].adr=(*pdx);
		///
		(*pdx)++;//add the address
		break;
	case procedure:
		table[(*ptx)].level=lev;
		break;
	case function:
		table[(*ptx)].level=lev;

		break;
		////
	case parameter:
		table[(*ptx)].level=lev;
		break;
	}
}

int position(char *idt,int tx)
{
	int i;
	strcpy(&(table[0].name[0]),idt);
	i=tx;
	while(strcmp(&(table[i].name[0]),idt)!=0)
	{
		i--;
	}
	return i;
}
int deal_statement(bool *fsys,int *ptx,int lev)
{
	int i,cx1;
	int case_flag1=0;
	int case_jmp[10];//最多有十个分支
	int case_flag2=0;
	int add_flag=1;
	int p_procedure;
	bool nextlev[keynum];
	enum typeset ident_buffer;
	enum typeset temp;
	bool statement_firstset[keynum];//define the firstset of the statement_firset
	for(i=0;i<keynum;i++)	
		statement_firstset[i]=false;
	statement_firstset[beginsym]=true;
	statement_firstset[ifsym]=true;
	statement_firstset[forsym]=true;
	statement_firstset[casesym]=true;
	statement_firstset[writesym]=true;
	statement_firstset[readsym]=true;
	statement_firstset[ident]=true;
	statement_firstset[nul]=true;
	
	if(sym==ident)
	{
		   //getsymdo;
		/*如果是函数调用语句,
			则对参数进行处理,
			关键!!
			*/
		    i=position(id,*ptx);
			if(i==0)
			{
				printerr(25);
			}
			//can't find the var
			else
			{
				if(table[i].kind==function)
				{
					//pa.i=table[i].adr;
					//do_genecode(cal,lev-table[i].level,pa,integer);
					getsymdo;
				//	p_procedure=i;
					if(sym!=assign)
							printerr(46);
					else
						do_deal_expression(nextlev,ptx,lev);
					//}
					/*if(sym!=lparen)
					{
						if(table[i+1].kind==parameter)
							printerr(34);
						if(sym!=assign)
							printerr(46);
						else
							do_deal_expression(fsys,ptx,lev);
					}
					else
					{
						do{
							getsymdo;//get the parameter
							i=position(id,*ptx);
							if(i==0)
							{
								printerr(34);
							}
							if(table[i+1].kind!=parameter)///
							{
								printerr(34);
							}
							temp=table[++p_procedure].type;
							//考虑参数的装载.
							if(!(temp==integer&&sym==integersym)&&!(temp==real&&sym==realsym)&&!(temp==plchar&&sym==charsym))//if(temp!=table[i].type)
							{
								printerr(35);
							}
							getsymdo;//get the next one 
						}while(sym==comma);
						p_procedure=0;////////////////
						if(sym!=rparen)
						{
							printerr(7);
						}
						getsymdo;
						if(sym!=assign)
							printerr(46);
						else
							do_deal_expression(fsys,ptx,lev);
						if(sym!=semicolon)
							printerr(0);
						else
							getsymdo;
					}*/
				}
				if(table[i].kind==procedure)
				{
					//printerr(26);
					//i=0;
					//genecode
					//printf("应该在此处理过程.\n");
					pa.i=table[i].adr;
					do_genecode(cal,lev-table[i].level,pa,integer);
					getsymdo;
					p_procedure=i;
					if(sym!=lparen)
					{
						if(table[i+1].kind==parameter)
						{
							printerr(34);
						}//have some useful information
						if(sym!=semicolon)
						{
							printerr(0);
							//i=0;
						}
						else 
							getsymdo;
					}
					else//有实参
					{
						
						do{
							getsymdo;//get the parameter
							i=position(id,*ptx);
							if(i==0)
							{
								printerr(34);
							}
							if(table[i+1].kind!=parameter)///
							{
								printerr(34);
							}
							temp=table[++p_procedure].type;
							//考虑参数的装载.
							if(!(temp==integer&&sym==integersym)&&!(temp==real&&sym==realsym)&&!(temp==plchar&&sym==charsym))//if(temp!=table[i].type)
							{
								printerr(35);
							}
							getsymdo;//get the next one 
						}while(sym==comma);
						p_procedure=0;////////////////
						if(sym!=rparen)
						{
							printerr(7);
						}
						getsymdo;
						if(sym!=semicolon)
						{
							// ;
							printerr(0);
						}
						getsymdo;
					}
				}// if it is the var or parameter or value sentence
				if(table[i].kind==var||table[i].kind==parameter)//find to here
				{
					getsymdo;//get the next sym;
					ident_buffer=table[i].type;//buffer the type 
					if(sym==assign)/////////////:=
					{
						getsymdo;
					}
					else
					{
						printerr(8);// no :=
					}
					//如果是用函数赋值语句
					if(position(id,*ptx))
					{
						memcpy(nextlev,fsys,sizeof(bool)*keynum);
						do_deal_expression(nextlev,ptx,lev);//处理符号右侧的表达式
						//the level should be changed.
						if(i!=0)
						{
							//use the command sto to value
							pa.i=table[i].adr;
							do_genecode(sto,lev-table[i].level,pa,integer);
						}	
					}
				}
			}
		}  
	//}/////////////////
		else if(sym==readsym)
			//read 语句//
			//vip
		{
			getsymdo;
			if(sym!=lparen)
			{
				printerr(27);//wrong of the read sentence
			}
			else
			{
				//lparen
				do
				{
					getsymdo;
					//get the next symbol
					if(sym==ident)
						//sym is an ident
					{
						i=position(id,*ptx);
						//查找要读的变量.
					}
					else
					{
						i=0;//vip///其它均认为是错.
					}
					if(i==0)
					{
						printerr(28);
					}
					else
					{
						//在table中找到了对应的变量
						///此处应该对类型进行考虑.
						//???????
						//生成代码
						temp=table[i].type;
						if(temp==integer)
						{
							pa.i=16;
						}
						else
						{
							pa.i=17;
						}
						do_genecode(opr,0,pa,integer);
						pa.i=table[i].adr;
						do_genecode(sto,lev-table[i].level,pa,integer);
						//储存到变量.
					}
					getsymdo;
				}while(sym==comma);
			}
				//get out the loop
			if(sym!=rparen)
					//error
			{
				printerr(27);
				//while(sym!=semicolon)
			//	{
			//		getsymdo;
			//	}
			}
			//跳过所有相关错误,直到句末.
			else
			{
				getsymdo;
			}
		}
		else if(sym==writesym)
		{
			// 字符串,表达式的处理..
			getsymdo;
			if(sym==lparen)
			{//// 字符串在此处应该如何处理?
				do
				{
					getsymdo;
					/*if(sym!=stringsym)
						printerr(29);
					else
						getsymdo;
					i=position(id,*ptx);
					if(i==0)
						printerr(29);
					else
						switch(table[i].type)
					{
						case real:
							if(strcmp(&(string_buffer[0]),"real")!=0)
								printerr(29);
							break;
						case integer:
							if(strcmp(&(string_buffer[0]),"integer")!=0)
								printerr(29);
							break;
						case plchar:
							if(strcmp(&(string_buffer[0]),"char")!=0)
								printerr(29);
							break;
						default :
							break;
					}*/
					memcpy(nextlev,fsys,sizeof(bool)*keynum);
					nextlev[rparen]=true;
					nextlev[comma]=true;//write的后跟符号为rparen ,comma
					do_deal_expression(nextlev,ptx,lev);
					//调用表达式的处理
					pa.i=14;
					do_genecode(opr,0,pa,integer);//生成输出
				}while(sym==comma);
				if(sym!=rparen)
				{
					printerr(29); 
				}
				else
				{
					getsymdo;
				}
				pa.i=15;
				do_genecode(opr,0,pa,integer);
			}
			else
			{
				printerr(29);
			//	while(sym!=semicolon)
			//	{
			//		getsymdo;
			//	}
			}
		}
		else if(sym==ifsym)
		{
			getsymdo;
			memcpy(nextlev,fsys,sizeof(bool)*keynum);
			nextlev[thensym]=true;
			nextlev[elsesym]=true;
		//	nextlev[dosym]=true;
			do_deal_condition(nextlev,ptx,lev);
			//调用条件处理函数处理
			if(sym==thensym)
			{
				//get if there a then
				getsymdo;
				//get the action;
			}
			else
			{
				printerr(10);
			}
			///VIP
			//对跳转语句的处理
			cx1=cx;// save the cx
			pa.i=0;
			do_genecode(jpc,0,pa,integer);
			//生成跳转
			//处理then后的语句.
			//递归调用
			deal_statement(fsys,ptx,lev);
			code[cx1].a=cx;//
			//cx恰好是then后语句处理结束之后的位置
			//如果前面的条件不满足,则就应该跳转到此处.
			//getsymdo;
			if(sym==elsesym)
			{
				cx1=cx;
				getsymdo;
				pa.i=0;
				do_genecode(jpc,0,pa,integer);
				deal_statement(fsys,ptx,lev);
				code[cx1].a=cx;
			}
		}
		else if(sym==beginsym)
			//为复合语句
		{
			getsymdo;
			memcpy(nextlev,fsys,sizeof(bool)*keynum);
			nextlev[semicolon]=true;
			nextlev[endsym]=true;
			//递归调用
			do_deal_statement(nextlev,ptx,lev);
			while(sym==semicolon||(in_set(sym,statement_firstset)))// 多重
			{
				///vip
				//vip
				if(sym==semicolon)
				{
					getsymdo;
				}
				else
				{
					printerr(0);
				}//lose the semicolon
				if(sym==endsym)
				{
					break;
				}
				do_deal_statement(nextlev,ptx,lev);
			}
			if(sym==endsym)
			{
				//to the end
				getsymdo;
			}
			else
			{
				printerr(13);
				//printf("the programme has gone to here\n");
			}
		}
		//循环语句的处理
		else if(sym==forsym)
		{
			//cx1=cx;//keep the record.
			getsymdo;
			if(sym!=ident)
			{
				///
				printerr(40);
			}
			i=position(id,*ptx);
			if(i==0)
			{
				printerr(25);
			}
			getsymdo;
			if(sym!=assign)
			{
				printerr(41);//no :=
			}
			getsymdo;
			do_deal_expression(nextlev,ptx,lev);//处理赋值
			pa.i=table[i].adr;
			do_genecode(sto,lev-table[i].level,pa,integer);
			//cx1=cx;
			if(sym!=tosym && sym!=downtosym)
			{
				printerr(12);
			}
			if(sym==tosym)
				add_flag=1;
			else
				add_flag=-1;
			getsymdo;
			do_deal_expression(nextlev,ptx,lev);
			 
			if(sym!=dosym)
			{
				printerr(42);
			}//无do
			getsymdo;
			deal_statement(nextlev,ptx,lev);
			pa.i=0;
			do_genecode(jpc,0,pa,integer);
		}
		//case of 
		else if(sym==casesym)
		{
			getsymdo;
			//genecode
			do_deal_expression(fsys,ptx,lev);
			pa.i=table[i].adr;
			do_genecode(lit,lev-table[i].level,pa,integer); 
			if(sym!=ofsym)
				printerr(43);
			else
				do
				{
					getsymdo;
					/*i=position(id,*ptx);
					if(i==0)
						printerr(25);
					else
						getsymdo;
					//genecode*/
					if(sym==integersym)
					{
						pa.i=num;
						do_genecode(lit,0,pa,integer);
					}
					else if(sym==realsym)
					{
						pa.d=fnum;
						do_genecode(lit,0,pa,real);
					}
					else if(sym==charsym)
					{
						pa.c=char_buffer;
						do_genecode(lit,0,pa,plchar);
					}
					getsymdo;
					//read the :
					if(sym!=colon)
						printerr(44);
					pa.i=18;
					do_genecode(opr,0,pa,integer);
					//opr 18 是针对case语句而设的比较指令.
					//jpc
					getsymdo;
					deal_statement(fsys,ptx,lev);
					//printf("%s\n",id);
					cx1=cx;
					pa.i=0;
					do_genecode(jpc,0,pa,integer);
					pa.i=0;
					do_genecode(jmp,0,pa,integer);
					case_jmp[case_flag1++]=cx;
					code[cx1].a=cx;
				}while(sym==semicolon);
				for(i=0;i<case_flag1;i++)
					code[i].a=case_jmp[i];
				if(sym!=endsym)
					printerr(45);
				else
					getsymdo;
		}
		return 0;
}
 int deal_expression(bool *fsys,int *ptx,int lev)
{
	enum symbolset pmbuffer;
	/*
	use it to buffer the plus or the minus
	*/
	bool nextlev[keynum];
	//a hash table
	if(sym==plus||sym==minus)
	{
		pmbuffer=sym;
		getsymdo;
		memcpy(nextlev,fsys,sizeof(bool)*keynum);
		nextlev[plus]=true;//正号;
		nextlev[minus]=true;//负号,注意对其的处理,前面对正负的处理可能与后有冲突.
		//接下来是对项的处理,调用deal_term,其后应有一函数调用:getsymdo
		do_deal_term(nextlev,ptx,lev);
		if(pmbuffer==minus)
		{
			pa.i=1;
			do_genecode(opr,0,pa,integer);//make the number minus生成取反指令
		}
	}
	else//如果不是负号,则直接进入项处理
	{
		memcpy(nextlev,fsys,sizeof(bool)*keynum);
		nextlev[plus]=true;
		nextlev[minus]=true;
		//无符号时直接处理项
		do_deal_term(nextlev,ptx,lev);
	}
	while(sym==plus||sym==minus)
		//自入项的循环处理
	{
		pmbuffer=sym;
		getsymdo;
		memcpy(nextlev,fsys,sizeof(bool)*keynum);
		nextlev[plus]=true;
		nextlev[minus]=true;
		do_deal_term(nextlev,fsys,sizeof(bool)*keynum);
		if(pmbuffer==plus)

⌨️ 快捷键说明

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