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

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

?? 編譯原理.c

?? 編譯原理中PL/0程序的編譯過程.用C寫的
?? C
?? 第 1 頁 / 共 2 頁
字號:
		 case procedur:
			 table[(*ptx)].level=lev;                      /*過程名字*/
			 break;
	 }
 }
 /*
  *查找名字的位置
  *找到則返回在名字表中的位置,否則返回0
  *
  *idt:要查找的名字
  *tx:當前名字表尾指針
  */
int position(char *idt,int tx)
{
	int i;
	strcpy(table[0].name,idt);
	i=tx;
	while(strcmp(table[i].name,idt)!=0)
	{
		i--;
	}
	return i;
}
/*
 *常量聲明處理
 */
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);                  /*var后應是標識符*/
	}
	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",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);
     }
     if(sym!=rparen){
      error(33);
      while(!inset(sym,fsys)){
       getsymdo;
      }
     }
     else{
      getsymdo;
     }
    }
    else{
     if(sym==writesym){
      getsymdo;
      if(sym==lparen){
       do{
        getsymdo;
        memcpy(nxtlev,fsys,sizeof(bool)*symnum);
        nxtlev[rparen]=true;
        nxtlev[comma]=true;
        expressiondo(nxtlev,ptx,lev);
        gendo(opr,0,14);
       }while(sym==comma);
       if(sym!=rparen){
        error(33);
       }
       else{
        getsymdo;
       }
      }
      gendo(opr,0,15);
     }
     else{
      if(sym==callsym){
       getsymdo;
       if(sym!=ident){
        error(14);
       }
       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);
         }
         else{
          error(15);
         }
        }
        getsymdo;
       }
      }
      else{
       if(sym==ifsym){
        getsymdo;
        memcpy(nxtlev,fsys,sizeof(bool)*symnum);
        nxtlev[thensym]=true;
        nxtlev[dosym]=true;
        conditiondo(nxtlev,ptx,lev);
        if(sym==thensym){
         getsymdo;
        }
        else{
         error(16);
        }
        cx1=cx;
        gendo(jpc,0,0);
        statementdo(fsys,ptx,lev);
        code[cx1].a=cx;
       }
       else{
        if(sym==beginsym){
         getsymdo;
         memcpy(nxtlev,fsys,sizeof(bool)*symnum);
         nxtlev[semicolon]=true;
         nxtlev[endsym]=true;
         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);
         }
        }
        else{
         if(sym==whilesym){
          cx1=cx;
          getsymdo;
          memcpy(nxtlev,fsys,sizeof(bool)*symnum);
          nxtlev[dosym]=true;
          conditiondo(nxtlev,ptx,lev);
          cx2=cx;
          gendo(jpc,0,0);
          if(sym==dosym){
           getsymdo;
          }
          else{
           error(18);
          }
          statementdo(fsys,ptx,lev);
          gendo(jmp,0,cx1);
          code[cx2].a=cx;
         }
         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);
}
/*通過過程基址求上一層的基址*/
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| 亚洲一区电影777| 国产一区二区三区四区五区入口| 一道本成人在线| 日韩欧美国产一区在线观看| 久久久综合网站| 日本不卡视频在线| 91网址在线看| 久久久久99精品一区| 一区二区三区波多野结衣在线观看| 久久av资源站| 欧美色老头old∨ideo| 亚洲日本韩国一区| 丁香激情综合国产| 欧美草草影院在线视频| 亚洲成人福利片| 91视频精品在这里| 亚洲欧洲成人精品av97| 激情小说欧美图片| 日韩欧美高清dvd碟片| 亚洲综合免费观看高清完整版在线 | 国产精品美女久久久久久久久久久 | 国产精品一二三四五| 日韩欧美三级在线| 激情综合色综合久久综合| 日韩一区二区免费电影| 日韩黄色免费网站| 欧美一区二区精品| 日本不卡123| 91精品国产福利| 免费在线观看精品| 26uuu色噜噜精品一区| 久久99精品久久久| 2022国产精品视频| 国产美女在线精品| 日本一区二区三区免费乱视频| 国产在线日韩欧美| 久久久久久免费网| 国产精品99久久不卡二区| 久久免费午夜影院| 不卡视频在线看| 综合亚洲深深色噜噜狠狠网站| 91亚洲资源网| 亚洲成人黄色小说| 欧美哺乳videos| 国产精品一区二区三区乱码| 欧美videossexotv100| 极品少妇xxxx精品少妇| 久久久天堂av| 99热精品一区二区| 亚洲一二三区在线观看| 日韩欧美另类在线| 成人自拍视频在线观看| 一区二区三区四区中文字幕| 欧美另类久久久品| 国模无码大尺度一区二区三区| 亚洲国产精品t66y| 欧美日韩一区不卡| 国产精一品亚洲二区在线视频| 中文字幕制服丝袜成人av | 国产91在线看| 亚洲激情图片qvod| 欧美一区二区三区在线视频| 国产成人在线看| 亚洲午夜精品网| 亚洲欧美日韩久久精品| 欧美日韩精品欧美日韩精品| 精品一区二区日韩| 亚洲男帅同性gay1069| 日韩欧美视频一区| 91久久精品一区二区| 毛片不卡一区二区| 玉足女爽爽91| 欧美激情一区二区三区在线| 色乱码一区二区三区88| 国产精品一区二区久激情瑜伽| 亚洲视频一区二区在线| 精品国产一区二区在线观看| 欧美亚洲尤物久久| 丁香婷婷深情五月亚洲| 亚洲成av人在线观看| 国产精品久久久久久久久果冻传媒 | 99久久综合精品| 美女一区二区三区在线观看| 国产精品黄色在线观看| 欧美一级黄色录像| 91福利国产精品| 懂色中文一区二区在线播放| 亚洲va韩国va欧美va精品| 精品久久一区二区三区| 欧美日韩免费电影| 91玉足脚交白嫩脚丫在线播放| 国产一区二区三区四| 欧美aⅴ一区二区三区视频| 亚洲黄一区二区三区| 国产精品午夜在线观看| 精品国产乱码久久久久久久久 | 国产很黄免费观看久久| 麻豆精品在线看| 天涯成人国产亚洲精品一区av| 亚洲精品国产一区二区精华液| 欧美极品xxx| 久久美女高清视频| 久久精品欧美一区二区三区不卡| 欧美一区二区视频免费观看| 欧美一区二区三区啪啪| 欧美日韩不卡一区二区| 欧美三级中文字| 欧美日韩一级大片网址| 久久嫩草精品久久久精品| 欧美大片一区二区| 欧美本精品男人aⅴ天堂| 91精品国产91久久久久久一区二区| 欧美在线|欧美| 精品视频在线视频| 3atv在线一区二区三区| 日韩视频免费观看高清完整版在线观看 | 亚洲丝袜另类动漫二区| 国产精品网曝门| 国产精品私人自拍| 综合激情成人伊人| 亚洲精品免费在线| 亚洲妇女屁股眼交7| 天堂av在线一区| 狠狠色狠狠色综合系列| 经典一区二区三区| 成人免费视频免费观看| 色综合咪咪久久| 欧美午夜精品久久久| 91精品国产入口| 久久影视一区二区| 中文字幕欧美一| 婷婷六月综合网| 国产精品一区二区91| 成人黄色av电影| 欧美日韩在线播放三区四区| 日韩免费高清av| 国产精品对白交换视频| 五月综合激情婷婷六月色窝| 美国av一区二区| 99热精品一区二区| 欧美一级日韩免费不卡| 国产欧美日韩不卡| 亚洲国产精品久久久久婷婷884| 99九九99九九九视频精品| 在线观看一区日韩| 欧美大肚乱孕交hd孕妇| 综合欧美亚洲日本| 免费人成在线不卡| 97久久精品人人做人人爽 | 久久久三级国产网站| 日韩一区在线看| 日韩精品电影在线| 成人午夜激情视频| 日韩一区二区三区视频在线| 国产人久久人人人人爽| 亚洲国产精品一区二区久久恐怖片| 狠狠色综合日日| 欧美性色综合网| 国产亚洲精品久| 午夜精品久久一牛影视| 国产精一区二区三区| 色综合天天综合给合国产| 日韩欧美成人一区二区| 亚洲人快播电影网| 国产精品88av| 欧美一区二区三区视频在线观看| 日韩精品一区在线观看| 一区二区高清视频在线观看| 国产一区二区三区四区五区入口 | 亚洲影院免费观看| 成人福利视频在线看| 久久蜜桃一区二区| 精品一区二区av| 欧美在线你懂得| 亚洲图片另类小说| 国产成人免费视频网站| 日韩三级伦理片妻子的秘密按摩| 亚洲一区二区成人在线观看| 成人听书哪个软件好| 精品播放一区二区| 午夜精品久久久久久久久久久| 成人精品免费网站| 日韩一级黄色大片| 一区二区三区日韩| 一本久久精品一区二区| 日本一区二区电影| 国产精品一区二区无线| 久久久综合精品| 国产一区二区三区电影在线观看| 日韩一区二区视频| 六月婷婷色综合| 亚洲精品一区二区三区在线观看| 日本aⅴ亚洲精品中文乱码| 777a∨成人精品桃花网| 天天综合网天天综合色|