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

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

?? pl0.java

?? pl0的好的編譯程序,通過這個程序可以很好的了解編譯的過程,掌握編譯器的運行原理!
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
	if(sym==Symbol.ident)
	{
		x=enter(Object.variable,ptx,lev,pdx);
		getsym();
	}
	else
	   error(4);
   
   return x;
}

void listcode(int cx0)
{
	int i;
  	for(i=cx0;i<cx;i++)
  	{	if(code[i].f==Function.inte)
  		  System.out.printf("%d %s %d %d\n",i,"int",code[i].l,code[i].a);
     	else   System.out.printf("%d %s %d %d\n",i,code[i].f.name(),code[i].l,code[i].a);
  	}
  	
}

int statement(int ptx,int lev)
{
	int i,cx1,cx2;
   	if(sym==Symbol.ident)
   	{
		i=position(token,ptx);
   	 	if(i!=0)
   	 	{
   	 		if(table[i].kind==Object.variable)
   	 		{
   	 	        getsym();
	 			if(sym==Symbol.assign)
	 			{
	 				getsym();
	 				ptx=expression(ptx,lev);
	 			}
	 			else
	 				error(13);
	 		 	gen(Function.sto,lev-table[i].level,table[i].adr);
	 			
   	 		 	
   	 		}
   	 		else
   	 		{
   	 		   error(12);
	 		 i=0;
   	 	    }
   		}
   	 		
   	 	else error(11);
   	
    }
    else if(sym==Symbol.readsym)
    	{
    	 	getsym();
    	 	if(sym==Symbol.lparen)
    	 	{
    	 		do{
	   			getsym();
	   	   		if(sym==Symbol.ident)
	   	   		    i=position(token, ptx);
	   	   		else
	   	   		  i=0;
	   	   	  
	   	   		
	   	     if(i!=0)
	   	   		{
	   	   			gen(Function.opr,0,16);
					gen(Function.sto,lev-table[i].level,table[i].adr);	//儲存到變量
				}
	   	   else
	   		   error(35);
				getsym();
			}while (sym==Symbol.comma);
    	 	  
			}
    	    else
			error(34);
			
			if(sym==Symbol.rparen)
				getsym();
		}
	else if(sym==Symbol.writesym)		
			{
				getsym();
				if(sym==Symbol.lparen)
				{
					do{
						getsym();
						ptx=expression(ptx,lev);
						gen(Function.opr,0,14);//生成輸出指令,輸出棧頂的值
					}while(sym==Symbol.comma);
					if(sym==Symbol.rparen)
						getsym();	
					else
						error(33);
					
				}
				gen(Function.opr,0,15);		//輸出換行
			}
	else if(sym==Symbol.callsym)		
		{
					getsym();
				
		if(sym==Symbol.ident)
		{
			i=position(token,ptx);
			if(i!=0){
				
			if(table[i].kind==Object.procedure)
			    gen(Function.cal,lev-table[i].level,table[i].adr);  //生成call指令
			else
				 error(15);     
			}
			else
				error(11);   
						getsym();
		}
			else error(14);
		}
  else if(sym==Symbol.ifsym)    
	{
		getsym();
		ptx=condition(ptx,lev);  
		if(sym==Symbol.thensym)
				getsym();
		else
				error(16);         
		cx1=cx;                //保存當前指令地址
		gen(Function.jpc,0,0);        //生成條件跳轉指令,跳轉地址暫寫0
		ptx=statement(ptx,lev);   //處理then后的語句
		code[cx1].a=cx;     //地址回填,經statement處理后,cx為then后語句執行完的位置,它正是前面未定的跳轉地址
	}
	else if(sym==Symbol.beginsym)   
	{
		getsym();
		ptx=statement(ptx,lev);
		while(sym==Symbol.beginsym|sym==Symbol.callsym|sym==Symbol.ifsym|sym==Symbol.whilesym|sym==Symbol.semicolon)
		{
		   if(sym==Symbol.semicolon)
			   getsym();
		    else
		    	error(10);
			ptx=statement(ptx,lev);
		}
		if(sym==Symbol.endsym)
		     getsym();
		else
			error(17); 
		}
	else if(sym==Symbol.whilesym)
	{
		cx1=cx;        //保存判斷條件的位置
		getsym();
		ptx=condition(ptx,lev); 
		cx2=cx;       //保存循環體的結束的下一個位置
		gen(Function.jpc,0,0);//生成條件跳轉,但跳出循環體的地址未知
		if(sym==Symbol.dosym)
		   getsym();
		else
			error(18);     
								
		ptx=statement(ptx,lev); 
		gen(Function.jmp,0,cx1);//回頭重新判斷條件
		code[cx2].a=cx;   //回填跳出循環體的地址
	}
	
	return ptx;
}


int expression(int ptx,int lev)
{
	Symbol addop;

	if(sym==Symbol.plus||sym==Symbol.minus)           
	{
		addop=sym; // 保存開頭的正負號
		getsym();
		
		ptx=term(ptx,lev);
		if(addop==Symbol.minus)
			gen(Function.opr,0,1);//如果開頭為負號生成取負指令
	}
	else                            
		ptx=term(ptx,lev);           
	
	while(sym==Symbol.plus||sym==Symbol.minus)
	{
		addop=sym;
		getsym();
		
		ptx=term(ptx,lev);            
		if(addop==Symbol.plus)
			gen(Function.opr,0,2);              
		
		else
			 gen(Function.opr,0,3);           		
	}
	return ptx;
}

int term(int ptx,int lev)
{
    Symbol mulop;               //用于保存乘除法符號
     ptx=factor(ptx,lev);      
    while(sym==Symbol.multiply||sym==Symbol.divide)
    {
		mulop=sym;
        getsym();
        ptx=factor(ptx,lev);
        if(mulop==Symbol.multiply)
            gen(Function.opr,0,4);      
        else
            gen(Function.opr,0,5);        
        
    }
     return ptx;
}

int factor(int ptx,int lev)
 {
    int i;
  
    while(sym==Symbol.ident|sym==Symbol.number|sym==Symbol.lparen)         
    {
        if(sym==Symbol.ident)                 
        {
            i=position(token,ptx);        
           
            if(i!=0)  
            	switch(table[i].kind)
				{
					case constant:                                      
						gen(Function.lit,0,table[i].val);  //直接把常量的值入棧
						break;
					case variable:                                
						gen(Function.lod,lev-table[i].level,table[i].adr); //找到變量地址并將其值入棧
						break;
					case procedure:                                     
						error(21);                                      
						break;
				}
			
            else
                error(11);              
            
			getsym();


		}
	else if(sym==Symbol.number)                                             
		{	gen(Function.lit,0,num);
				getsym();
			}
	else if(sym==Symbol.lparen)                                         
		{		getsym();
				ptx=expression(ptx,lev);
				if(sym==Symbol.rparen)
					getsym();
				else
					error(22);                                     
					
		}
	}
	return ptx;
}

int condition(int ptx,int lev)
{
    Symbol relop;
  
    if(sym==Symbol.oddsym)                        
   	{
		getsym();
		ptx=expression(ptx,lev);
		gen(Function.opr,0,6); //生成odd指令
    }
    else
    {
		ptx=expression(ptx,lev);
		if(sym!=Symbol.eql&&sym!=Symbol.neq&&sym!=Symbol.lss&&sym!=Symbol.leq&&sym!=Symbol.gtr&&sym!=Symbol.geq)
		{
			error(20);
		}
		else
		{
			relop=sym;
			getsym();
			ptx=expression(ptx,lev);
			switch(relop)
			{
				case eql:
					gen(Function.opr,0,8);
					break;
				case neq:
					gen(Function.opr,0,9);
					break;
				case lss:
					gen(Function.opr,0,10);
					break;
				case geq:
					gen(Function.opr,0,11);
					break;
				case gtr:
					gen(Function.opr,0,12);
					break;
				case leq:
					gen(Function.opr,0,13);
					break;
			}

		}
    }
    return ptx;
}                            

void interpret()
{
	int p,b,t;            
	Instruction i;  //存放當前指令
	int[] s=new int[stackSize];   
	System.out.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--;
						if(s[t-1]==s[t])
						s[t-1]=1;
						else
							s[t-1]=0;
 						break;
					case 9://兩個數是否不等
						t--;
						if(s[t-1]!=s[t])
						s[t-1]=1;
						else s[t-1]=0;
 						break;
					case 10://第一是否小于第二個
						t--;
						if(s[t-1]<s[t])
						s[t-1]=1;
						else 
							s[t-1]=0;
 						break;
					case 11://第一個數是否大于等于第二個
						t--;
						if(s[t-1]>=s[t])
						s[t-1]=1;
						else
							s[t-1]=0;
 						break;
					case 12://第一個數是否大于
						t--;
						if(s[t-1]>s[t])
						s[t-1]=1;
						else
							s[t-1]=0;
 						break;
					case 13://第一個數是否小于等于
						t--;
						if(s[t-1]<=s[t])
						s[t-1]=1;
						else s[t-1]=0;
 						break;
					case 14://輸出
						System.out.print("The result is:");
						System.out.printf("%d",s[t-1]);
						t--;
						break;
					case 15://換行
						System.out.printf("\n");
						break;
					case 16://讀入
						System.out.printf("Enter a integer:");
						Scanner scanner = new Scanner(System.in); 
                        s[t]=scanner.nextInt();
						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);
}

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一区二区三区免费野_久草精品视频
日韩欧美国产综合| 亚洲第一激情av| 亚洲九九爱视频| 免费欧美在线视频| 91福利在线观看| 国产亚洲精品超碰| 日韩精品91亚洲二区在线观看| 国产91清纯白嫩初高中在线观看| 欧美在线观看一区二区| 国产精品视频一二| 国产做a爰片久久毛片| 欧美日韩精品一区视频| 最新日韩av在线| 国产精品资源在线| 日韩精品一区二区三区老鸭窝| 亚洲中国最大av网站| 99麻豆久久久国产精品免费优播| 欧美精品一区二区蜜臀亚洲| 亚洲成人综合在线| 欧洲一区二区三区在线| 亚洲免费在线电影| 91影院在线观看| 国产精品色噜噜| 国产91丝袜在线观看| 国产性色一区二区| 国产精品99久久久久久久vr | 亚洲制服丝袜一区| av在线这里只有精品| 中文一区二区完整视频在线观看| 久久av资源站| 欧美精品一区二区三区很污很色的 | 91日韩精品一区| 国产精品素人视频| 99精品视频在线播放观看| 2020国产精品| 国产成人av电影在线| 国产夜色精品一区二区av| 国产乱码一区二区三区| 久久久www成人免费毛片麻豆| 精品中文av资源站在线观看| 久久久精品蜜桃| 福利一区福利二区| 国产精品久久久久久福利一牛影视| 韩国三级在线一区| 久久精品夜色噜噜亚洲a∨| 国产麻豆视频一区| 国产精品免费视频网站| 一本久久a久久免费精品不卡| 亚洲综合视频网| 日韩一区二区三区三四区视频在线观看| 日韩成人一区二区| 欧美一级日韩免费不卡| 久久99精品久久久| 国产精品色在线| 色www精品视频在线观看| 亚洲高清在线精品| 日韩一级视频免费观看在线| 极品少妇xxxx偷拍精品少妇| 欧美高清在线视频| 欧美无砖砖区免费| 久久激情五月婷婷| 国产精品久久福利| 欧美日韩免费电影| 国产一区二区三区av电影| 国产精品美女久久久久久| 91传媒视频在线播放| 亚洲成人av一区二区三区| 久久蜜桃av一区二区天堂| 91视频在线观看免费| 日本亚洲电影天堂| 国产精品久久久久精k8| 91精品中文字幕一区二区三区 | 午夜久久久久久久久| 久久精品视频免费| 欧美日韩精品一区二区在线播放| 精品一区二区三区影院在线午夜 | 91丨九色丨黑人外教| 奇米四色…亚洲| 亚洲青青青在线视频| 精品日韩99亚洲| 91福利社在线观看| 国产伦精品一区二区三区免费| 一个色妞综合视频在线观看| 精品国产乱码久久久久久久| 欧美在线观看禁18| 粉嫩av亚洲一区二区图片| 日日噜噜夜夜狠狠视频欧美人| 国产蜜臀av在线一区二区三区| 欧美久久久久免费| 91日韩一区二区三区| 国产不卡一区视频| 久久国产麻豆精品| 亚洲va欧美va人人爽| 亚洲欧美在线观看| 国产色产综合产在线视频| 欧美人狂配大交3d怪物一区| 99久久综合99久久综合网站| 国产在线国偷精品产拍免费yy| 午夜欧美在线一二页| 一区二区三区丝袜| 亚洲欧美日韩久久| 国产精品久久福利| 国产精品免费久久久久| 久久久国产综合精品女国产盗摄| 欧美人牲a欧美精品| 欧美日韩一区二区三区四区五区| 成人av电影在线播放| 国产精品99久久久久久久女警| 久久狠狠亚洲综合| 视频一区欧美日韩| 天天综合日日夜夜精品| 一区二区三区精品| 尤物视频一区二区| 亚洲六月丁香色婷婷综合久久| 中文字幕人成不卡一区| 国产精品久久久久久久久久久免费看| 国产视频视频一区| 国产精品乱码一区二三区小蝌蚪| 久久久精品国产免大香伊| 国产亚洲成av人在线观看导航| 国产午夜久久久久| 国产精品女上位| 亚洲日本免费电影| 亚洲影视在线观看| 成人精品国产福利| 国产宾馆实践打屁股91| 波多野结衣中文字幕一区二区三区| 99这里都是精品| 色狠狠一区二区三区香蕉| 欧美调教femdomvk| 日韩欧美亚洲国产精品字幕久久久| 日韩精品一区二区三区视频播放 | 国产精品麻豆久久久| 亚洲婷婷综合久久一本伊一区| 亚洲激情图片qvod| 日韩电影免费在线| 丰满白嫩尤物一区二区| 99精品视频一区二区三区| 欧美性生交片4| 欧美刺激午夜性久久久久久久| 久久久精品国产99久久精品芒果 | 久久久精品国产免大香伊| 国产精品家庭影院| 天天免费综合色| 国产麻豆精品95视频| 色综合久久久久| 日韩美女主播在线视频一区二区三区| 亚洲精品一区二区三区四区高清| 国产精品久久综合| 性欧美大战久久久久久久久| 国产呦萝稀缺另类资源| 91女厕偷拍女厕偷拍高清| 91精品在线观看入口| 中文av字幕一区| 日韩电影免费一区| 成人av影院在线| 日韩一区二区三区在线观看| 欧美韩国日本综合| 亚洲高清免费在线| 国产99精品国产| 欧美一区二区三区视频在线观看| 国产欧美日本一区二区三区| 视频一区二区三区中文字幕| 成人av手机在线观看| 日韩一级二级三级| 亚洲精品高清视频在线观看| 国产在线精品一区二区不卡了| 欧美性生活一区| 中文字幕乱码日本亚洲一区二区| 亚洲地区一二三色| 99久久99久久久精品齐齐| 欧美tickling挠脚心丨vk| 亚洲高清在线精品| caoporm超碰国产精品| 精品国产露脸精彩对白| 亚洲成人久久影院| 色综合久久66| 国产精品国产成人国产三级| 激情综合色播五月| 欧美丰满一区二区免费视频| 一区二区三区资源| 成+人+亚洲+综合天堂| 久久久精品国产免大香伊 | 一区二区三区在线观看动漫| 国产在线看一区| 日韩一区二区电影在线| 亚洲午夜精品17c| 91免费在线看| 亚洲欧美综合网| 不卡的av网站| 国产精品无人区| 丁香激情综合国产| 久久蜜桃av一区二区天堂 | 国产成人亚洲综合a∨婷婷| 日韩一区二区麻豆国产| 日本不卡免费在线视频| 日韩欧美一区二区三区在线| 青青草原综合久久大伊人精品| 欧美一级xxx| 日本va欧美va欧美va精品|