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

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

?? pl0.c

?? PL0編譯器,有5個附加功能。編譯原理實驗用。
?? C
?? 第 1 頁 / 共 3 頁
字號:
				{
					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
					{
					  if(sym==plusone||minusone)/*準備按照++a、--a語句處理*/
						 {
						    sym2=sym;
						    getsymdo;
							if(sym==ident)
							 {
						    	i=position(id,*ptx); // ptx 名字表尾指針
   	 	                        if(i==0)
								{
   	 		                       error(11);
								}
   	 	                         else
								{
   	 		                      if(table[i].kind!=variable) //非變量 錯誤
								  {
   	 		 	                     error(12);
   	 		 	                     i=0;
								  }
                                   else  //是變量
								   {
									getsymdo;
									 if(sym2==plusone)
									  {
										gendo(lod,lev-table[i].level,table[i].adr);  //將變量放到棧頂
					                    gendo(lit,0,1);   //將常量值1取到棧頂運行
					                    gendo(opr,0,2);   //進行自+1
					                    gendo(sto,lev-table[i].level,table[i].adr); //棧頂的內容送回變量中
									 }
									if(sym2==minusone)
									 {
                                       gendo(lod,lev-table[i].level,table[i].adr);
					                   gendo(lit,0,1);
					                   gendo(opr,0,3);    //進行自-1
					                   gendo(sto,lev-table[i].level,table[i].adr); 
									 }

									}
								}
							}
						  else
							 {
						    	error(34); /* ++a、--a運算后面接的不是標識符產生錯誤*/
							  }

							}
						  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);          /*生成乘法指令*/
        }
        if(mulop==slash)
        {
            gendo(opr,0,5);           /*生成除法指令*/
        }
	
    }
     return 0;
}
/*
*因子處理
*/
int factor(bool*fsys,int *ptx,int lev)
 {
    int i;
    bool nxtlev[symnum];
	enum symbol sym2;
    testdo(facbegsys,fsys,24);           /*檢測因子的開始符號*/
    while(inset(sym,facbegsys))          /*循環直到不是因子開始符號*/
    {
        if(sym==ident)                   /*因子為常量或者變量*/
        {
            i=position(id,*ptx);        /*查找名字*/
            if(i==0)
            {
                error(11);               /*標識符未聲明*/
				getsymdo;
            }
            else
            {
				switch(table[i].kind)
				{
					case constant:                                      /*名字為常量*/
						gendo(lit,0,table[i].val);                       /*直接把常量的值入棧*/
						getsymdo;
						break;
					case variable:                                      /*名字為變量*/
						getsymdo;
						if(sym==plusone||sym==minusone)
							gendo(lit,0,1);                //將1送入棧頂
						gendo(lod,lev-table[i].level,table[i].adr);      /*找到變量地址并將其值入棧*/
						
						if(sym==plusone)
						{
						  gendo(opr,0,2);
						  gendo(sto,lev-table[i].level,table[i].adr);//將棧頂的內容送入變量單元中
						  gendo(opr,0,17);           //s[t]++
						  getsymdo;
						}
						if(sym==minusone)
						{
						  gendo(opr,0,3);
						  gendo(sto,lev-table[i].level,table[i].adr);  //將棧頂的內容送入變量單元中
						  gendo(opr,0,17);      //s[t]++
						  getsymdo;
						}
						break;
					case procedur:                                      /*名字為過程*/
						error(21);                                       /*不能為過程*/
						getsymdo;
						break;
				}
			}
			
		}
		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);                                       /*缺少右括號*/
					}
				}
				else
				{
				  if(sym==plusone||minusone)    //因子開始符號為+=或-=
				  {
                     sym2=sym;
					 getsymdo;
					 if(sym==ident)       //是變量或常量
					 {
					   i=position(id,*ptx);
					   if(i==0)
					   {
						error(11); 
					   }
					   else
					   {
						 if(table[i].kind!=variable)
						 {
						  error(12);   // 只有變量才能做自加自減運算,否則出錯
						  i=0;
						 }
						 else        //是變量
						 {
						   gendo(lod,lev-table[i].level,table[i].adr);      //變量的值送入棧頂
						   if(sym2==plusone)     //是+=
						   {
							gendo(lit,0,1);      //將1送入棧頂, s[t]=1
						    gendo(opr,0,2);      //s[t-1]=s[t-1]+s[t]
						    gendo(sto,lev-table[i].level,table[i].adr);   //棧頂的值送入變量中
						    gendo(lod,lev-table[i].level,table[i].adr);   //再將變量的值送入棧頂
						   }
						   if(sym2==minusone)  //是-=
						   {
							gendo(lit,0,1);       //將1送入棧頂, s[t]=1
						    gendo(opr,0,3);        //進行-1操作
						    gendo(sto,lev-table[i].level,table[i].adr);//棧頂的值送入變量中
						    gendo(lod,lev-table[i].level,table[i].adr); //再將變量的值送入棧頂
						   }
						   getsymdo;

						 }
					   }
					 }
					 else
					 {
						error(34); // 前自加、前自減運算后面接的不是標識符產生錯誤
					 }
				  }

				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指令s[t-1]=s[t-1]%2*/
    }
    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);    //s[t-1]=(s[t-1]==s[t])
					break;
				case neq:
					gendo(opr,0,9);         //s[t-1]=(s[t-1]!=s[t])
					break;
				case lss:
					gendo(opr,0,10);        //s[t-1]=(s[t-1]<s[t])
					break;
				case geq:
					gendo(opr,0,11);         //s[t-1]=(s[t-1]>=s[t])
					break;
				case gtr:
					gendo(opr,0,12);       //s[t-1]=(s[t-1]>s[t])
					break;
				case leq:
					gendo(opr,0,13);      //s[t-1]=(s[t-1]<=s[t])
					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;
					case 17:
						s[t]++;       //kuo
						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一区二区三区免费野_久草精品视频
欧美性猛交一区二区三区精品| 精品对白一区国产伦| 丁香五精品蜜臀久久久久99网站 | 久久久久久久电影| 欧美猛男超大videosgay| eeuss鲁片一区二区三区在线观看| 高清不卡一区二区| 国产一区二区毛片| 国产综合久久久久久久久久久久| 久久爱www久久做| 日韩av成人高清| 香蕉加勒比综合久久| 日本aⅴ免费视频一区二区三区| 亚洲综合在线观看视频| 综合色中文字幕| 一区二区三区成人| 亚洲欧美日韩在线不卡| 国产精品初高中害羞小美女文| 一区在线观看视频| 中文字幕一区在线观看视频| 国产精品丝袜91| 亚洲精品国产一区二区精华液 | 午夜精品久久久久久久蜜桃app | 成人免费毛片片v| 国产精品夜夜爽| 国产精品成人午夜| 亚洲激情六月丁香| 一区二区三区日韩精品| 亚洲黄色av一区| 亚洲制服丝袜一区| 婷婷久久综合九色综合伊人色| 日本一不卡视频| 精品中文字幕一区二区小辣椒| 久久成人av少妇免费| 国产69精品久久99不卡| 99在线精品免费| 欧洲精品一区二区三区在线观看| 欧美岛国在线观看| 国产女人18毛片水真多成人如厕 | 亚洲一区二区三区小说| 日本成人在线电影网| 激情国产一区二区| 国产福利一区二区三区视频在线| 成人一区二区三区在线观看 | 在线免费观看日本一区| 99久久精品免费看国产| 欧美日韩国产在线播放网站| 欧美一区二区三区婷婷月色| 国产精品色呦呦| 亚洲一区成人在线| 久久国产精品72免费观看| 国产精品一区2区| 日本电影欧美片| 在线观看日韩精品| 欧美大肚乱孕交hd孕妇| 一区二区在线观看不卡| 人人精品人人爱| 99国产精品一区| 欧美一卡二卡三卡| 欧美极品少妇xxxxⅹ高跟鞋| 奇米精品一区二区三区在线观看一| 韩国成人在线视频| 91久久精品一区二区三| 久久精品视频在线看| 一个色在线综合| 韩国v欧美v日本v亚洲v| 欧美日本一区二区| 欧美激情一区在线| 国产精品伦理一区二区| 日韩高清在线观看| 成人av网站免费| 久久色在线视频| 亚洲大片免费看| 成人听书哪个软件好| 日韩精品一区二区在线| 一区二区三区四区高清精品免费观看 | 国产成人精品一区二| 欧美视频一区二区三区| 国产网站一区二区| 蜜桃一区二区三区在线观看| 不卡的电影网站| 亚洲国产精品ⅴa在线观看| 亚洲18影院在线观看| 国内久久精品视频| 91精品国产综合久久久久| 成人欧美一区二区三区白人| 国产精品一区在线观看乱码| 欧美日韩卡一卡二| 国产精品成人午夜| av不卡免费在线观看| 久久综合精品国产一区二区三区 | 亚洲欧美日韩综合aⅴ视频| 国产成人免费视频| 精品国产人成亚洲区| 水野朝阳av一区二区三区| 欧美最猛黑人xxxxx猛交| 中文字幕一区二区三区四区| 久草热8精品视频在线观看| 日韩欧美在线观看一区二区三区| 最新日韩在线视频| 国产91精品一区二区麻豆网站| 久久久精品欧美丰满| 蜜臀久久99精品久久久画质超高清| 日本道在线观看一区二区| 亚洲欧美一区二区在线观看| 国产成人日日夜夜| 国产精品区一区二区三区| 韩国精品久久久| 欧美xxxxx裸体时装秀| 久久国产精品99久久人人澡| 538prom精品视频线放| 中文字幕av资源一区| 99在线精品观看| 亚洲欧洲99久久| 91成人免费网站| 一区二区三区自拍| 91在线播放网址| 亚洲va中文字幕| 欧美吞精做爰啪啪高潮| 中文字幕色av一区二区三区| 欧美专区日韩专区| 亚洲综合一区在线| 91麻豆精品国产91久久久久久| 国产麻豆精品在线| 精品少妇一区二区三区免费观看 | 日韩一二三区不卡| 乱一区二区av| 精品久久久久久无| 成人丝袜18视频在线观看| 亚洲视频图片小说| 91麻豆免费看片| 日韩精品91亚洲二区在线观看 | 国产欧美中文在线| 91黄色小视频| 午夜影视日本亚洲欧洲精品| 欧美三级日韩三级| 韩国精品主播一区二区在线观看 | 美日韩一区二区| 亚洲国产精品av| 日本二三区不卡| 久久精品久久久精品美女| 久久免费电影网| 99久久综合国产精品| 免费在线观看一区| 久久久五月婷婷| 国产精品白丝av| 亚洲成人福利片| 亚洲精品一区二区精华| 91丝袜美女网| 日韩极品在线观看| 国产视频一区在线播放| 欧美午夜影院一区| 麻豆成人免费电影| 国产精品免费视频一区| 欧美天天综合网| 精品在线免费视频| 一区二区三区四区在线免费观看| 91精品国产品国语在线不卡 | 精品国产伦一区二区三区免费 | 青青草国产精品97视觉盛宴| 欧美精品一二三| youjizz久久| 无吗不卡中文字幕| 国产精品国产自产拍高清av王其 | 亚洲女性喷水在线观看一区| 精品1区2区在线观看| 日本乱码高清不卡字幕| 男女性色大片免费观看一区二区 | 中文字幕欧美激情一区| 色偷偷成人一区二区三区91| 久草精品在线观看| 一区二区三区四区视频精品免费 | 国产精品麻豆久久久| 欧美精品v国产精品v日韩精品 | 麻豆极品一区二区三区| 一区二区三区四区在线| 欧美精品一区二区三区蜜桃| 99在线精品视频| 国产乱码精品一区二区三区忘忧草| 亚洲人吸女人奶水| 7777女厕盗摄久久久| 色综合久久中文综合久久97| 蜜臀久久久久久久| 亚洲国产裸拍裸体视频在线观看乱了| 久久精品亚洲一区二区三区浴池| 欧洲一区在线电影| 91丨九色丨黑人外教| 久久99日本精品| 一区二区三区久久| 欧美激情一区二区| 精品久久国产老人久久综合| 欧美日本国产视频| 99国产精品久久久| 国产98色在线|日韩| 国产毛片精品视频| 国产又黄又大久久| 国产中文字幕精品| 精品一区二区影视| 国产真实乱偷精品视频免| 久久97超碰国产精品超碰|