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

📄 pll.h

📁 pl0的扩展编译器
💻 H
📖 第 1 页 / 共 4 页
字号:
		{
			pa.i=2;
			do_genecode(opr,0,pa,integer);
			//生成加法指令.
			//下面将判断并生成减法;
		}
		else
		{
			pa.i=3;
			do_genecode(opr,0,pa,integer);
		}
	}
	//printf("have been to the deal of expession\n");
	return 0;
}
//项处理函数
int deal_term(bool *fsys,int *ptx,int lev)
{
	enum symbolset multibuffer;
	bool nextlev[keynum];
	memcpy(nextlev,fsys,sizeof(bool)*keynum);
	nextlev[multi]=true;
	nextlev[divid]=true;
	do_deal_factor(nextlev,ptx,lev);
	//处理因子
	while(sym==multi||sym==divid)
	{
		//运算式的处理
		multibuffer=sym;
		getsymdo;
		do_deal_factor(nextlev,ptx,lev);
		if(multibuffer==multi)
		{
			pa.i=4;
			//printf("/////生成乘法指令.\n");
			do_genecode(opr,0,pa,integer);
		}
		else
		{
			pa.i=5;
			do_genecode(opr,0,pa,integer);
		}
	}
	return 0;
}
int deal_factor(bool *fsys,int *ptx,int lev)
{
	int i;
	bool nextlev[keynum];
	//first集的检查
	bool factor_firstset[keynum];
	for(i=0;i<keynum;i++)
		factor_firstset[i]=false;
	factor_firstset[lparen]=true;
	factor_firstset[integersym]=true;
	factor_firstset[realsym]=true;
	factor_firstset[ident]=true;
	factor_firstset[charsym]=true;
	while(sym==ident||sym==integersym||sym==lparen||sym==charsym||sym==realsym)//sym检查是否为合法前集
	{
		if(sym==ident)///////////////////if it is the procedure should getout
		{
			i=position(id,*ptx);
			if(i==0)
			{
				printerr(30);
			}
			if(table[i].kind==procedure)
			{
				//printf("%在因子中出现了过程.\n");
			}
			else
			{
				switch(table[i].kind)
				{
				case constant:
					if(table[i].type=integer)
					{
						pa.i=table[i].val_int;
						do_genecode(lit,0,pa,integer);
						break;
					}
					else if(table[i].type=real)
					{
						pa.d=table[i].val_real;
						do_genecode(lit,0,pa,real);
						break;
					}
					else if(table[i].type=plchar)
					{
						pa.c=table[i].c;
						do_genecode(lit,0,pa,plchar);
						break;
					}
					//该处应商榷,如何在栈中存放各种类型.
					//可能要对生成代码的函数进行修改.
					else if(table[i].type=string)
					{
						strcpy(&(pa.s[0]),&(table[i].string[0]));
						do_genecode(lit,0,pa,string);//table[i].string);
						break;
					}
					/////////////////////??????????????
				case var:
						pa.i=table[i].adr;
						 do_genecode(lod,lev-table[i].level,pa,integer);
						 //get the address and lev,and put it to the stack
						 break;
				case parameter://将参数视作本层变量.同变量同样处理.
					pa.i=table[i].adr;
					do_genecode(lod,lev-table[i].level,pa,integer);
					break;
				case procedure:
					printerr(31);
					break;
				case function:
					//deal with 
					//push the parameter
					//pay attention to the parameters
					while(table[i].kind==parameter)
					{

					}
					pa.i=table[i].adr;
					do_genecode(cal,lev-table[i].level,pa,integer);//
					getsymdo;
					if(sym!=assign)
						printerr(46);
					getsymdo;
					do_deal_expression(fsys,ptx,lev);
					break;
				}
			}
			getsymdo;
		}
		else if(sym==integersym)
		{
			if(num>amax)
			{
				printerr(14);
				num=0;
				//make it to zero
			}
			pa.i=num;
			do_genecode(lit,0,pa,integer);
			//generate the lit code
			getsymdo;
		}
		else if(sym==charsym)
		{
			pa.c=char_buffer;
			do_genecode(lit,0,pa,plchar);
			getsymdo;
		}
		else if(sym==realsym)
		{
			pa.d=fnum;
			do_genecode(lit,0,pa,real);
			getsymdo;
		}
		else if(sym==lparen)
		{
			getsymdo;
			memcpy(nextlev,fsys,sizeof(bool)*keynum);
			nextlev[rparen]=true;
			//递归调用表达式处理子程序.
			deal_expression(fsys,ptx,lev);
			if(sym==rparen)
			{
				getsymdo;
			}
			else
			{
				printerr(31);/////////////???????????????????????
			}
		}
		//针对错误的跳跃处理.
		//test(fsys,factor_firstset,keynum);
	}
	return 0;
}
//对条件处理
int deal_condition(bool *fsys,int *ptx,int lev)
{
	enum symbolset relop;
	bool nextlev[keynum];
	memcpy(nextlev,fsys,sizeof(bool)*keynum);
	//fellow set 
	nextlev[eql]=true;
	//=
	nextlev[neql]=true;
	//<>
	nextlev[less]=true;
	//<
	nextlev[leql]=true;
	//<=
	nextlev[grt]=true;
	//>
	nextlev[geql]=true;
	//>=
	//调用表达处理子程序.
	do_deal_expression(nextlev,ptx,lev);
	//判断是否是关系运算符
	if(sym!=eql&&
		sym!=neql&&
		sym!=less&&
		sym!=leql&&
		sym!=grt&&
		sym!=geql)
	{
		printerr(32);
	}
	else
	{
		relop=sym;
		//buffer the sym;
		//prevent it from changing 
		getsymdo;
		deal_expression(nextlev,ptx,lev);
		switch(relop)
		{
			// =
		case eql:
			pa.i=8;
			do_genecode(opr,0,pa,integer);
			break;
			// <> !=
		case neql:
			pa.i=9;
			do_genecode(opr,0,pa,integer);
			break;
			// <
		case less:
			pa.i=10;
			do_genecode(opr,0,pa,integer);
			break;
			// <=
		case leql:
			pa.i=13;
			do_genecode(opr,0,pa,integer);
			break;
			// >=
		case geql:
			pa.i=11;
			do_genecode(opr,0,pa,integer);
			break;
			//>
		case grt:
			pa.i=12;
			do_genecode(opr,0,pa,integer);
			break;
		}
	}
	return 0;
}

///寻址程序
int base(int lev,struct stacktable *stack,int b)
{
	int b1;
	b1=b;
	while(lev>0)
	{
		b1=stack[b1].i;
		lev--;
	}
	return b1;
}

////////////////////


//解释程序
void interpret_exec()
{
	int p,b,t;
	struct instruction i;
	struct stacktable stack[512];
	//maxsum
	printf("Interpretor start execute...\n");
	t=0;
	b=0;
	p=0;
	//在下面的代码中将前三项赋为零,这与bx初值为3有关.

	stack[0].i=0;
	stack[1].i=0;
	stack[2].i=0;
	////////////////////////////////////////

	do
	{
		i=code[p];
		p++;
		//get the code;
		switch(i.vc)
		{
		case lit:
			switch(i.flag)
			{
				case 0:
					stack[t].i=i.a;
					break;
				case 1:
					stack[t].c=i.c;
					break;
				case 2:
					stack[t].d=i.d;
					break;
			}
			t++;
			break;
    	case opr:
			switch(i.a)
			{
			case 0:
				t=b;
				p=stack[t+2].i;
				b=stack[t+1].i;
				break;
			case 1:
				//minus
				if(i.flag==0)
				{
					stack[t-1].i=-stack[t-1].i;
				}
				if(i.flag==2)
				{
					//double or real 
					stack[t-1].d=-stack[t-1].d;
				}
				break;
			case 2://add
				t--;
				if(i.flag==0)
				{
					//int 
					stack[t-1].i=stack[t-1].i+stack[t].i;
				}
				if(i.flag==2)
				{
					//double or real;
					stack[t-1].d=stack[t-1].d+stack[t].d;//
				}
				break;
			case 3://minus
				t--;
				if(i.flag==0)
				{
					//int 
					stack[t-1].i=stack[t-1].i-stack[t].i;
				}
				if(i.flag==2)
				{
					//double or real
					stack[t-1].d=stack[t-1].d-stack[t].d;
				}
				break;
			case 4:
				t--;
				if(i.flag==0)
				{
					stack[t-1].i=stack[t-1].i*stack[t-1].i;
				}
				if(i.flag==2)
				{
					stack[t-1].d=stack[t-1].d*stack[t-1].d;
				}
				break;
			case 5:
				t--;
				if(i.flag==0)
				{
					stack[t-1].i=stack[t-1].i/stack[t].i;
				}
				if(i.flag==2)
				{
					stack[t-1].d=stack[t-1].d/stack[t].d;
				}
				break;
			case 6:
				//
				break;//not use the  !
			case 8:
				t--;
				//==
				//对于所有的逻辑运算,应将integer i 作为运算结果.
				if(i.flag==0)
					stack[t-1].i=(stack[t-1].i==stack[t].i);
				if(i.flag==2)
					stack[t-1].i=(stack[t-1].d==stack[t].d);
				if(i.flag==1)
					stack[t-1].i=(stack[t-1].c==stack[t].c);
				break;
			case 9:
				//<>
				t--;
				if(i.flag==0)
					stack[t-1].i=(stack[t-1].i!=stack[t].i);
				if(i.flag==1)
					stack[t-1].i=(stack[t-1].c!=stack[t].c);
				if(i.flag==2)
					stack[t-1].i=(stack[t-1].d!=stack[t].d);
				break;
			case 10:
				//<
				t--;
				if(i.flag==0)
					stack[t-1].i=(stack[t-1].i<stack[t].i);
				if(i.flag==1)
					stack[t-1].i=(stack[t-1].c<stack[t].c);
				if(i.flag==2)
					stack[t-1].i=(stack[t-1].d<stack[t].d);
				break;
			case 11:
				//>=
				t--;
				if(i.flag==0)
					stack[t-1].i=(stack[t-1].i>=stack[t].i);
				if(i.flag==1)
					stack[t-1].i=(stack[t-1].c>=stack[t].c);
				if(i.flag==2)
					stack[t-1].i=(stack[t-1].d>=stack[t].d);
				break;
			case 12:
				//>
				t--;
				if(i.flag==0)
					stack[t-1].i=(stack[t-1].i>stack[t].i);
				if(i.flag==1)
					stack[t-1].i=(stack[t-1].c>stack[t].c);
				if(i.flag==2)
					stack[t-1].i=(stack[t-1].d>stack[t].d);
				break;
			case 13:
				//<=
				t--;
				if(i.flag==0)
					stack[t-1].i=(stack[t-1].i<=stack[t].i);
				if(i.flag==1)
					stack[t-1].i=(stack[t-1].c<=stack[t].c);
				if(i.flag==2)
					stack[t-1].i=(stack[t-1].d<=stack[t].d);
				break;
			case 14:
				//print command
				//print to the file out
				if(i.flag==0)
				{
					printf("%d\n",stack[t-1].i);
					//fprintf(fout,"%d",stack[t-1].i);
				}
				if(i.flag==1)
				{
					printf("%c\n",stack[t-1].c);
					//fprintf(fout,"%c",stack[t-1].c);
				}
				if(i.flag==2)
				{
					printf("%f\n",stack[t-1].d);
					//fprintf(fout,"%f",stack[t-1].d);
				}
				t--;
				break;
			case 15:
				//print \n
				printf("\n");
				//fprintf(fout,"%c",'\n');
				break;
			case 16:
				printf(">");
				//fprintf(fout,"%c",'>');
				if(i.flag==0)
				{
					scanf("%d",&(stack[t].i));
					//fprintf(fout,"%d",stack[t].i);
					printf("%d\n",stack[t].i);
				}
				if(i.flag==1)
				{
					scanf("%c",&(stack[t].c));
					//fprintf(fout,"%c",stack[t].c);
					printf("%c\n",stack[t].c);
				}
				if(i.flag==2)
				{
					scanf("%f",&(stack[t].d));
					//fprintf(fout,"%f",stack[t].d);
					printf("%f\n",stack[t].d);
				}
				t++;//vip
				break;
			case 17:
				printf(">");
				//fprintf(fout,"%c",'>');
				if(i.flag==0)
				{
					scanf("%d",&(stack[t].i));
				//	fprintf(fout,"%d",stack[t].i);
					printf("%d\n",stack[t].i);
				}
				if(i.flag==1)
				{
					scanf("%c",&(stack[t].c));
					//fprintf(fout,"%c",stack[t].c);
					printf("%c\n",stack[t].c);
				}
				if(i.flag==2)
				{
					scanf("%f",&(stack[t].d));
					//fprintf(fout,"%f",stack[t].d);
					printf("%f\n",stack[t].d);
				}
				t++;//vip
				break;
			case 18:
				if(i.flag==0)
				{
					if(stack[t].i==stack[t-1].i)
						{
							//ok
							t--;
						}
					else
						{
							stack[t].i=0;
						}
				}
				else if(i.flag==1)
				{
					if(stack[t].c==stack[t-1].c)
						t--;
					else
						stack[t].c='\0';
				}
				else if(i.flag==2)
				{
					if(stack[t].d==stack[t-1].d)
						t--;
					else
						stack[t].d=0.;
				}
				break;
			case 19:
				break;
			default :
				break;
			}
			break;
			case lod:
				//base function 
				if(i.flag==0)
					stack[t].i=stack[base(i.l,stack,b)+i.a].i;//find and load the value in the mem
				if(i.flag==1)
					stack[t].c=stack[base(i.l,stack,b)+i.a].c;
				if(i.flag==2)
					stack[t].d=stack[base(i.l,stack,b)+i.a].c;
				t++;//top add
				break;
			case sto:
				//指针下移.
				t--;
				//将栈顶值上载到内存变量中.
				if(i.flag==0)
					//int
					stack[base(i.l,stack,b)+i.a].i=stack[t].i;
				if(i.flag==1)
					//int 
					stack[base(i.l,stack,b)+i.a].c=stack[t].c;
				if(i.flag==2)
					//int
					stack[base(i.l,stack,b)+i.a].d=stack[t].d;
				//base function
				break;
			case cal:
				stack[t].i=base(i.l,stack,b);
				stack[t+1].i=b;
				stack[t+2].i=p;
				b=t;
				p=i.a;
				break;
			case inte:
				//分配内存
				t+=i.a;
				break;
			case jmp:
				p=i.a;
				break;
			case jpc:
				t--;
				if(stack[t].i==0)
				{
					p=i.a;
				}
				break;
			}
		}while(p!=0);
}

⌨️ 快捷键说明

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