亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pl0.cpp

?? 清華大學出版 編譯原理后面的PL0
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
}
/*
 *常量聲明處理
 */
int constdeclaration(int *  ptx,int lev,int *  pdx)
{
	if(sym==ident)
	{
		getsymdo;
		if(sym==eql ||sym==becomes)
		{
			if(sym==becomes)
			{
				error(1);                     /*把=寫出成了:=*/
			}
			getsymdo;
			if(sym==number)
			{
				enter(constant,ptx,lev,pdx);
				getsymdo;
			}
			else
			{
				error(2);                  /*常量說明=后應是數字*/
			}         
		}
		else
		{
			error(3);                       /*常量說明標識后應是=*/
		}
	}
	else
	{
		error(4);                        /*const后應是標識*/
	}
	return 0;
}
/*
 *
 */
int vardeclaration(int * ptx,int lev,int * pdx)
{
	if(sym==ident)
 	{
 		enter(variable,ptx,lev,pdx);//填寫名字表
 		getsymdo;
 	}
 	else
 	{
 		error(4);
    }
    return 0;
}
 /*
  *輸入目標代碼清單
  */
void listcode(int cx0)
{
	int i;
   	if (listswitch)
   	{
   		for(i=cx0;i<cx;i++)
   	 	{
   	 		printf("%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);
   	 		fprintf(fa,"%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);
   	    }
   	 }
}
/*
*語句處理
*/
int statement(bool* fsys,int * ptx,int lev)
{
	int i,cx1,cx2;
   	bool nxtlev[symnum];
   	if(sym==ident)
   	{
		i=position(id,*ptx);
   	 	if(i==0)
   	 	{
   	 		error(11);
   	 	}
   	 	else
   	 	{
   	 		if(table[i].kind!=variable)
   	 		{
   	 		 	error(12);
   	 		 	i=0;
   	 		}
   	 		else
   	 		{
   	 			getsymdo;
   	 			if(sym==becomes)
   	 			{
   	 				getsymdo;
   	 			}
   	 			else
   	 			{
   	 			 	error(13);
   	 			}
   	 			memcpy(nxtlev,fsys,sizeof(bool)* symnum);
   	 			expressiondo(nxtlev,ptx,lev);
   	 			if(i!=0)
   	 			{
   	 			 	gendo(sto,lev-table[i].level,table[i].adr);
   	 			}
   	 	    }
   		}
    }
    else
    {
    	if(sym==readsym)
    	{
    	 	getsymdo;
    	 	if(sym!=lparen)
    	 	{
    	 	   error(34);
			}
    	    else
			{
    	   		do{
    	   			getsymdo;
    	   	   		if(sym==ident)
    	   	   		{
    	   	   	  		i=position(id, *ptx);
    	   	   		}
    	   	   		else
    	   	   		{
    	   	   	  		i=0;
    	   	   		}
    	   	   		if(i==0)
    	   	   		{
    	   	   	 		error(35);
    	   	   		}
    	   	   		else
    	   	   		{
    	   	   			gendo(opr,0,16);
						gendo(sto,lev-table[i].level,table[i].adr);	/* 儲存到變量*/
					}
					getsymdo;
				}while (sym==comma);	/*一條read語句可讀多個變量 */
			}
			if(sym!=rparen)
			{
				error(33);			/* 格式錯誤,應是右括號*/
				while(!inset(sym,fsys))/* 出錯補救,直到收到上層函數的后跟符號*/
				{
					getsymdo;
				}
			}
			else
			{
				getsymdo;
			}
		}
		else
		{
			if(sym==writesym)			/* 準備按照write語句處理,與read類似*/
			{
				getsymdo;
				if(sym==lparen)
				{
					do{
						getsymdo;
						memcpy(nxtlev,fsys,sizeof(bool)*symnum);
						nxtlev[rparen]=true;
						nxtlev[comma]=true;		/* write的后跟符號為)or,*/
						expressiondo(nxtlev,ptx,lev);/* 調用表達式處理,此處與read不同,read為給變量賦值*/
						gendo(opr,0,14);/* 生成輸出指令,輸出棧頂的值*/
					}while(sym==comma);
					if(sym!=rparen)
					{
						error(33);/* write()應為完整表達式*/
					}
					else
					{
						getsymdo;
					}
				}
				gendo(opr,0,15);		/* 輸出換行*/
			}
			else
			{
				if(sym==callsym)		/* 準備按照call語句處理*/
				{
					getsymdo;
					if(sym!=ident)
					{
						error(14);           /*call后應為標識符*/
					}
					else
					{
						i=position(id,*ptx);
						if(i==0)
						{
							error(11);          /*過程未找到*/
						}
						else
						{
							if(table[i].kind==procedur)
							{
								gendo(cal,lev-table[i].level,table[i].adr);  /*生成call指令*/
							}
							else
							{
								error(15);      /*call后標識符應為過程*/
							}
						}
						getsymdo;
					}
				}
				else
				{
					if(sym==ifsym)     /*準備按照if語句處理*/
					{
						getsymdo;
						memcpy(nxtlev,fsys,sizeof(bool)*symnum);
						nxtlev[thensym]=true;
						nxtlev[dosym]=true;    /*后跟符號為then或do*/
						conditiondo(nxtlev,ptx,lev);   /*調用條件處理(邏輯運算)函數*/
						if(sym==thensym)
						{
							getsymdo;
						}
						else
						{
							error(16);          /*缺少then*/
						}
						cx1=cx;                /*保存當前指令地址*/
						gendo(jpc,0,0);        /*生成條件跳轉指令,跳轉地址暫寫0*/
						statementdo(fsys,ptx,lev);   /*處理then后的語句*/
						code[cx1].a=cx;      /*經statement處理后,cx為then后語句執行
                            完的位置,它正是前面未定的跳轉地址*/
					}
					else
					{
						if(sym==beginsym)   /*準備按照復合語句處理*/
						{
							getsymdo;
							memcpy(nxtlev,fsys,sizeof(bool)*symnum);
							nxtlev[semicolon]=true;
							nxtlev[endsym]=true;/*后跟符號為分號或end*/
							/*循環調用語句處理函數,直到下一個符號不是語句開始符號或收到end*/
							statementdo(nxtlev,ptx,lev);
							while(inset(sym,statbegsys)||sym==semicolon)
							{
								if(sym==semicolon)
								{
									getsymdo;
								}
								else
								{
									error(10);/*缺少分號*/
								}
								statementdo(nxtlev,ptx,lev);
							}
							if(sym==endsym)
							{
								getsymdo;
							}
							else
							{
								error(17); /*缺少end或分號*/
							}
						}
						else
						{
							if(sym==whilesym)/*準備按照while語句處理*/
							{
								cx1=cx;        /*保存判斷條件超作的位置*/
								getsymdo;
								memcpy(nxtlev,fsys,sizeof(bool)*symnum);
								nxtlev[dosym]=true;/*后跟符號為do*/
								conditiondo(nxtlev,ptx,lev);  /*調用條件處理*/
								cx2=cx;       /*保存循環體的結束的下一個位置*/
								gendo(jpc,0,0);/*生成條件跳轉,但跳出循環的地址未知*/
								if(sym==dosym)
								{
									getsymdo;
								}
								else
								{
									error(18);      /*缺少do*/
								}
								statementdo(fsys,ptx,lev); /*循環體*/
								gendo(jmp,0,cx1);/*回頭重新判斷條件*/
								code[cx2].a=cx;   /*反填跳出循環的地址,與if類似*/
							}
							else
							{
								memset(nxtlev,0,sizeof(bool)*symnum);/*語句結束無補救集合*/
								testdo(fsys,nxtlev,19);/*檢測語句結束的正確性*/
							}
						}
					}
				}
			}
		}
	}
	return 0;
}
/*
*表達式處理
*/
int expression(bool*fsys,int*ptx,int lev)
{
	enum symbol addop;                    /*用于保存正負號*/
	bool nxtlev[symnum];
	if(sym==plus||sym==minus)             /*開頭的正負號,此時當前表達式被看作一個正的或負的項*/
	{
		addop=sym;                    /*保存開頭的正負號*/
		getsymdo;
		memcpy(nxtlev,fsys,sizeof(bool)*symnum);
		nxtlev[plus]=true;
		nxtlev[minus]=true;
		termdo(nxtlev,ptx,lev);                /*處理項*/
		if(addop==minus)
		{
			gendo(opr,0,1);                   /*如果開頭為負號生成取負指令*/
		}
	}
	else                             /*此時表達式被看作項的加減*/
	{
		memcpy(nxtlev,fsys,sizeof(bool)*symnum);
		nxtlev[plus]=true;
		nxtlev[minus]=true;
		termdo(nxtlev,ptx,lev);            /*處理項*/
	}
	while(sym==plus||sym==minus)
	{
		addop=sym;
		getsymdo;
		memcpy(nxtlev,fsys,sizeof(bool)*symnum);
		nxtlev[plus]=true;
		nxtlev[minus]=true;
		termdo(nxtlev,ptx,lev);              /*處理項*/
		if(addop==plus)
		{
			gendo(opr,0,2);                    /*生成加法指令*/
		}
		else
		{
			 gendo(opr,0,3);                /*生成減法指令*/
		}
	}
	return 0;
}
/*
*項處理
*/
int term(bool*fsys,int *ptx,int lev)
{
    enum symbol mulop;               /*用于保存乘除法符號*/
    bool nxtlev[symnum];
    memcpy(nxtlev,fsys,sizeof(bool)*symnum) ;
    nxtlev[times]=true;
    nxtlev[slash]=true;
    factordo(nxtlev,ptx,lev);       /*處理因子*/
    while(sym==times||sym==slash)
    {
		mulop=sym;
        getsymdo;
        factordo(nxtlev,ptx,lev);
        if(mulop==times)
        {
            gendo(opr,0,4);          /*生成乘法指令*/
        }
        else
        {
            gendo(opr,0,5);           /*生成除法指令*/
        }
    }
     return 0;
}
/*
*因子處理
*/
int factor(bool*fsys,int *ptx,int lev)
 {
    int i;
    bool nxtlev[symnum];
    testdo(facbegsys,fsys,24);           /*檢測因子的開始符好號*/
    while(inset(sym,facbegsys))          /*循環直到不是因子開始符號*/
    {
        if(sym==ident)                   /*因子為常量或者變量*/
        {
            i=position(id,*ptx);        /*查找名字*/
            if(i==0)
            {
                error(11);               /*標識符未聲明*/
            }
            else
            {
				switch(table[i].kind)
				{
					case constant:                                      /*名字為常量*/
						gendo(lit,0,table[i].val);                       /*直接把常量的值入棧*/
						break;
					case variable:                                      /*名字為變量*/
						gendo(lod,lev-table[i].level,table[i].adr);      /*找到變量地址并將其值入棧*/
						break;
					case procedur:                                      /*名字為過程*/
						error(21);                                       /*不能為過程*/
						break;
				}
			}
			getsymdo;
		}
		else
		{
			if(sym==number)                                             /*因子為數*/
			{
				if(num>amax)
				{
					error(31);
					num=0;
				}
				gendo(lit,0,num);
				getsymdo;
			}
			else
			{
				if(sym==lparen)                                           /*因子為表達式*/
				{
					getsymdo;
					memcpy(nxtlev,fsys,sizeof(bool)*symnum);
					nxtlev[rparen]=true;
					expressiondo(nxtlev,ptx,lev);
					if(sym==rparen)
					{
						getsymdo;
					}
					else
					{
						error(22);                                       /*缺少右括號*/
					}
				}
				testdo(fsys,facbegsys,23);                        /*銀子后有非法符號*/
			}
		}
	}
	return 0;
}
/*
 條件處理*/
int condition(bool* fsys,int* ptx,int lev)
{
    enum symbol relop;
    bool nxtlev[symnum];
    if(sym==oddsym)                        /*準備按照odd運算處理*/
   	{
		getsymdo;
		expressiondo(fsys,ptx,lev);
		gendo(opr,0,6);                              /*生成odd指令*/
    }
    else
    {
		memcpy(nxtlev,fsys,sizeof(bool)*symnum);
		nxtlev[eql]=true;
		nxtlev[neq]=true;
		nxtlev[lss]=true;
		nxtlev[leq]=true;
		nxtlev[gtr]=true;
		nxtlev[geq]=true;
		expressiondo(nxtlev,ptx,lev);
		if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq)
		{
			error(20);
		}
		else
		{
			relop=sym;
			getsymdo;
			expressiondo(fsys,ptx,lev);
			switch(relop)
			{
				case eql:
					gendo(opr,0,8);
					break;
				case neq:
					gendo(opr,0,9);
					break;
				case lss:
					gendo(opr,0,10);
					break;
				case geq:
					gendo(opr,0,11);
					break;
				case gtr:
					gendo(opr,0,12);
					break;
				case leq:
					gendo(opr,0,13);
					break;
			}

		}
    }
    return 0;
}                                                  /*解釋程序*/

void interpret()
{
	int p,b,t;             /*指令指針,指令基址,棧頂指針*/
	struct instruction i;  /*存放當前指令*/
	int s[stacksize];      /*棧*/
	printf("start pl0\n");
	t=0;
	b=0;
	p=0;
	s[0]=s[1]=s[2]=0;
	do{
		i=code[p];         /*讀當前指令*/
		p++;
		switch(i.f)
		{
			case lit:        /*將a的值取到棧頂*/
				s[t]=i.a;
				t++;
				break;
			case opr:        /*數字、邏輯運算*/
				switch(i.a)
				{
					case 0:
						t=b;
						p=s[t+2];
						b=s[t+1];
						break;
					case 1:
						s[t-1]=-s[t-1];
						break;
					case 2:
						t--;
						s[t-1]=s[t-1]+s[t];
						break;
					case 3:
						t--;
						s[t-1]=s[t-1]-s[t];
						break;
					case 4:
						t--;
						s[t-1]=s[t-1]*s[t];
						break;
					case 5:
						t--;
						s[t-1]=s[t-1]/s[t];
             			break;
					case 6:
						s[t-1]=s[t-1]%2;
						break;
					case 8:
						t--;
						s[t-1]=(s[t-1]==s[t]);
 						break;
					case 9:
						t--;
						s[t-1]=(s[t-1]!=s[t]);
 						break;
					case 10:
						t--;
						s[t-1]=(s[t-1]<s[t]);
 						break;
					case 11:
						t--;
						s[t-1]=(s[t-1]>=s[t]);
 						break;
					case 12:
						t--;
						s[t-1]=(s[t-1]>s[t]);
 						break;
					case 13:
						t--;
						s[t-1]=(s[t-1]<=s[t]);
 						break;
					case 14:
						printf("%d",s[t-1]);
						fprintf(fa2,"%d",s[t-1]);
						t--;
						break;
					case 15:
						printf("\n");
						fprintf(fa2,"\n");
						break;
					case 16:
						printf("?");
						fprintf(fa2,"?");
						scanf("%d",&(s[t]));
						fprintf(fa2,"%d\n",s[t]);
						t++;
						break;
				}
				break;
			case lod:       /*取相對當前過程的數據基地址為a的內存的值到棧頂*/
				s[t]=s[base(i.l,s,b)+i.a];
				t++;
				break;
			case sto:       /*棧頂的值存到相對當前過程的數據基地址為a的內存*/
				t--;
	            s[base(i.l,s,b)+i.a]=s[t];
				break;
			case cal:              /*調用子程序*/
				s[t]=base(i.l,s,b); /*將父過程基地址入棧*/
				s[t+1]=b;           /*將本過程基地址入棧,此兩項用于base函數*/
				s[t+2]=p;           /*將當前指令指針入棧*/
				b=t;                /*改變基地址指針值為新過程的基地址*/
				p=i.a;              /*跳轉*/
				break;
			case inte:             /*分配內存*/
				t+=i.a;
				break;
			case jmp:             /*直接跳轉*/
				p=i.a;
				break;
			case jpc:              /*條件跳轉*/
				t--;
				if(s[t]==0)
				{
					p=i.a;
				}
	    		break;
		}
	}while (p!=0);
}
/*通過過程基址求上1層過程的基址*/
int base(int l,int * s,int b)
{
	int b1;
	b1=b;
	 while(l>0)
	 {
		 b1=s[b1];
     	 l--;
	 }
	 return b1;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区你懂的| 日本精品视频一区二区三区| 成人一区在线观看| 欧美伊人久久久久久久久影院 | 国产成人精品亚洲777人妖| 久久久久久一二三区| 亚洲国产日韩a在线播放性色| 日韩精品一区二区在线| 日韩中文欧美在线| 欧美一区二区三区四区在线观看 | 亚洲视频一二三| 99国产精品久久久久久久久久久 | 国产成人av福利| 亚洲在线一区二区三区| 全国精品久久少妇| 91捆绑美女网站| 国产亚洲欧美日韩在线一区| 男男成人高潮片免费网站| 色94色欧美sute亚洲线路一ni| 国产亚洲精品超碰| 国产精品自拍av| 精品国产凹凸成av人网站| 石原莉奈在线亚洲二区| 欧美在线免费观看亚洲| 亚洲图片你懂的| 99久久国产免费看| 久久久一区二区三区捆绑**| 老司机免费视频一区二区| 欧美剧情电影在线观看完整版免费励志电影| 国产精品午夜春色av| 成人精品视频一区二区三区尤物| 久久精品亚洲乱码伦伦中文| 国内精品伊人久久久久av影院| 日韩免费电影一区| 国产一区二区主播在线| 精品福利视频一区二区三区| 成人午夜电影小说| 国产一区二区福利视频| 日本不卡的三区四区五区| 久久综合狠狠综合久久综合88 | 91精品国产乱码久久蜜臀| 丝袜美腿一区二区三区| 亚洲视频网在线直播| 欧美极品美女视频| 欧美激情综合在线| 亚洲天堂免费看| 欧美精选午夜久久久乱码6080| 国产黄色精品视频| 玉足女爽爽91| 一区二区三区**美女毛片| 亚洲欧美一区二区在线观看| 日日夜夜一区二区| 欧美美女视频在线观看| 国产乱码精品1区2区3区| 欧美日精品一区视频| 秋霞影院一区二区| 国产女人aaa级久久久级| 91香蕉视频污在线| 99久久精品国产一区二区三区| 成人自拍视频在线| 欧美一级理论性理论a| 欧美剧在线免费观看网站| 国产午夜久久久久| 亚洲国产一区二区视频| 美日韩一区二区| 一本久久a久久精品亚洲| 欧美三级乱人伦电影| 狠狠色综合日日| 日本一区免费视频| 欧美影视一区在线| 国内成人免费视频| 亚洲精品久久久蜜桃| 欧美电视剧在线看免费| 99精品欧美一区二区三区小说| 日韩综合一区二区| 国产精品三级视频| 日韩一区二区三区四区五区六区| 国产激情91久久精品导航| 亚洲国产视频网站| 欧美国产禁国产网站cc| 欧美精品国产精品| 波多野结衣一区二区三区| 日韩 欧美一区二区三区| 中文字幕欧美三区| 日韩精品一区二区三区中文精品| 91啪亚洲精品| 韩国v欧美v亚洲v日本v| 亚洲国产成人av网| 国产精品乱码久久久久久| 欧美一级xxx| 欧美综合色免费| 不卡的av在线播放| 精品一区二区三区香蕉蜜桃| 亚洲一二三四在线| 国产精品高潮久久久久无| 欧美tk—视频vk| 欧美一区二区日韩| 欧美丝袜丝交足nylons| 91丨porny丨首页| 国产成人精品一区二| 九色|91porny| 免费观看在线综合色| 亚洲第一搞黄网站| 国产精品一卡二卡在线观看| 日韩电影在线观看一区| 洋洋av久久久久久久一区| 国产精品久久三区| 国产视频视频一区| 久久久亚洲精华液精华液精华液| 欧美精品99久久久**| 在线观看av一区二区| 日本韩国欧美国产| 色综合久久综合中文综合网| 99re这里只有精品视频首页| 成人av在线资源网站| 粗大黑人巨茎大战欧美成人| 国产精品中文字幕日韩精品 | 国产精品久久看| 国产人成一区二区三区影院| 日韩一区二区高清| 欧美大片一区二区| 精品国产乱码久久久久久影片| 欧美成人精品1314www| 精品欧美乱码久久久久久 | 激情综合色综合久久| 美腿丝袜在线亚洲一区| 麻豆精品视频在线观看视频| 日韩电影免费一区| 久久精品二区亚洲w码| 韩国v欧美v日本v亚洲v| 国产99精品国产| 99re这里都是精品| 欧美日韩在线三区| 日韩欧美成人午夜| 久久精品欧美日韩精品 | bt7086福利一区国产| 99久久er热在这里只有精品66| 色乱码一区二区三区88| 欧美系列一区二区| 精品嫩草影院久久| 亚洲色图另类专区| 亚洲6080在线| 国产精品77777竹菊影视小说| 成人av动漫在线| 欧美日韩一二三区| 久久久精品影视| 亚洲高清不卡在线| 国产一区二区精品久久| 91久久精品网| 精品免费日韩av| 亚洲欧美激情在线| 热久久一区二区| 91在线码无精品| 久久综合九色综合97_久久久| 亚洲男女一区二区三区| 麻豆精品在线观看| 91免费观看视频在线| 欧美一区二区精美| 自拍偷拍欧美激情| 狠狠色丁香久久婷婷综| 91久久精品午夜一区二区| 久久日一线二线三线suv| 亚洲男同性视频| 国产精品一区二区三区四区| 在线观看成人小视频| 国产日韩欧美一区二区三区乱码 | 538prom精品视频线放| 国产三级久久久| 无吗不卡中文字幕| av网站免费线看精品| 精品国产一区二区三区不卡 | 色老头久久综合| 国产亚洲欧美色| 老司机一区二区| 欧美男生操女生| 亚洲免费观看高清| 国产成人小视频| 精品成人佐山爱一区二区| 香蕉影视欧美成人| 91福利区一区二区三区| 国产精品天干天干在线综合| 久久国产剧场电影| 欧美日本乱大交xxxxx| 亚洲日本韩国一区| 国产91精品精华液一区二区三区| 日韩欧美国产精品| 日韩 欧美一区二区三区| 欧美色图激情小说| 怡红院av一区二区三区| 99综合影院在线| 国产日韩欧美在线一区| 国产专区欧美精品| 精品日韩在线观看| 精品中文字幕一区二区| 91麻豆精品国产自产在线| 亚洲国产精品人人做人人爽| 色哟哟在线观看一区二区三区| 国产精品高清亚洲| 色哟哟国产精品| 一区二区三区在线高清|