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

📄 pl0c.txt

📁 pl0 扩展功能 包括++ -- 注释 for语句 repeat until语句 if else 语句
💻 TXT
📖 第 1 页 / 共 2 页
字号:
   i=position(id,*ptx); 
   if(i==0)
   {
    error(11);
	printf("标识符未说明\n");
   }
   else
   {
    if(table[i].kind!=variable)
    {
     error(12);
	 printf("赋值语句中,赋值号左部标识符属性应是变量\n");
     i=0;
    }
    else
    {
     getsymdo; 
     switch(sym)
      {
       case becomes:         
        getsymdo;
        memcpy(nxtlev,fsys,sizeof(bool)* symnum);
        expressiondo(nxtlev,ptx,lev);
        break;

       case incsym:           
        gendo(lod,lev-table[i].level,table[i].adr);
        gendo(lit,0,1);
        gendo(opr,0,2);  
        getsymdo;
        break;
     
       case decsym:          
        gendo(lod,lev-table[i].level,table[i].adr);
        gendo(lit,0,1);  
        gendo(opr,0,3);   
        getsymdo;
        break;

       case muleqlsym:       
        gendo(lod,lev-table[i].level,table[i].adr);
        getsymdo;
        memcpy(nxtlev,fsys,sizeof(bool)* symnum);
        expressiondo(nxtlev,ptx,lev);
        gendo(opr,0,4);  
        break;

       case diveqlsym:        
       gendo(lod,lev-table[i].level,table[i].adr);
       getsymdo;
       memcpy(nxtlev,fsys,sizeof(bool)* symnum);
       expressiondo(nxtlev,ptx,lev);
       gendo(opr,0,5);  
       break;
      
       default:
       error(8);
	   printf("程序体内语句部分的后跟符不正确\n");
       break;
      }
       
     if(i!=0)
      {
      gendo(sto,lev-table[i].level,table[i].adr);
      } 
     }
    }
   }
   else
   {
    if(sym==readsym)
    {
     getsymdo;
     if(sym!=lparen)
     {
      error(34);
	  printf("格式错误,应是左括号\n");
     }
     else
     {
       do{
         getsymdo;
         if(sym==ident)
         {
          i=position(id,*ptx);
         }
         else
         { 
          i=0; 
         }
         if(i==0)
         {
          error(35);
		  printf("read()中应是声明过的变量名\n");
         }
         else
         {
          gendo(opr,0,16);
          gendo(sto,lev-table[i].level,table[i].adr);
         }
         getsymdo;
        }while(sym==comma);
     }
     if(sym!=rparen)
     {
       error(33);
	   printf("格式错误,应是右括号\n");
       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);
		  printf("const,var,procedure后应为标识符\n");
        }
        else
        { 
         getsymdo;
        }
      }
        gendo(opr,0,15);
     }
	 else
	 {
		 if(sym==repeatsym)
		 { 
		   cx1=cx;         
		   getsymdo;
		   statementdo(nxtlev,ptx,lev); 
		   if(sym==semicolon)
		   {
               getsymdo;
		   }
		   if(sym==untilsym)
		   {
			getsymdo;
			conditiondo(nxtlev,ptx,lev);
			gendo(jpc,0,cx1);  
		   }
		   else
		   {
			 error(8);
			 printf("程序体内语句部分的后跟符不正确\n");
		   }
		 }
		 else
		 { 
			 if(sym==callsym)
			 {
				 getsymdo;
				 if(sym!=ident)
				 {
					 error(14);
					 printf("call后应为标识符\n");
				 }
				 else
				 {
					 i=position(id,*ptx);
					 if(i==0)
					 {
						 error(11);
						 printf("标识符未说明\n");
					 }
					 else
					 {
						 if(table[i].kind==procedur)
						 {
							 gendo(cal,lev-table[i].level,table[i].adr);
						 }
						 else
						 {
							 error(15);
							 printf("call后标识符属性应为过程\n");
						 }
					 }
					 getsymdo;
				 }
			 }
			 else
			 {
				 if(sym==ifsym) 
				 {
					 getsymdo;
					 memcpy(nxtlev,fsys,sizeof(bool)*symnum);
					 nxtlev[thensym]=true;
					 nxtlev[dosym]=true;
					 conditiondo(nxtlev,ptx,lev);
					 cx1=cx;
					 gendo(jpc,0,0);
					 if(sym==thensym)
					 {
						 getsymdo;
					 }
					 else
					 {
						 error(16);
						 printf("条件语句中丢了then\n");
					 }					 					 
					 statementdo(fsys,ptx,lev);
					 cx2=cx;
					 gendo(jmp,0,0);
					 getsymdo;
					 if(sym==elsesym)
					 {   
						 cx3=cx;
						 code[cx1].a=cx3;
						 getsymdo;
						 statementdo(fsys,ptx,lev);
						 code[cx2].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);
								 printf("语句之间丢了句号\n");
							 }
							 statementdo(nxtlev,ptx,lev);
						 }
						 if(sym==endsym)
						 {
							 getsymdo;
						 }
						 else
						 {
							 error(17);
							 printf("丢了end或;\n");
						 }
					 }
					 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);
								 printf("while循环语句中丢了do\n");
							 }
							 statementdo(fsys,ptx,lev);
							 gendo(jmp,0,cx1);
							 code[cx2].a=cx;
						 }
						 else
						 {
							 if(sym==forsym)
							 {
								 getsymdo;
								 if(sym!=lparen)
								 {
									 error(34);
									 printf("格式错误,应是左括号\n");
								 }
								 else
								 {
									 getsymdo;
									 statementdo(fsys,ptx,lev);
									 if(sym==semicolon)
									 {
										 getsymdo;
									 }
									 cx1=cx;
									 conditiondo(nxtlev,ptx,lev);
									 cx2=cx;
									 gendo(jpc,0,0);
									 cx4=cx;
									 gendo(jmp,0,0);
									 if(sym==semicolon)
									 {
										 cx3=cx;
										 getsymdo;
										 statementdo(nxtlev,ptx,lev);
										 gendo(jmp,0,cx1);
										 if(sym==rparen)
										 {
											 getsymdo;
										 }
										 else
										 {
											 error(22);
											 printf("表达式中漏掉)\n");
										 }
										 code[cx4].a=cx;
										 statementdo(nxtlev,ptx,lev);
										 gendo(jmp,0,cx3);
										 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);
	printf("标识符未说明\n");
   }
   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);
	   printf("表达式内标识符属性不能是过程\n");
       break;
    }
   }
   getsymdo;
  }
  else
  {
   if(sym==number)
   {
    if(num>amax)
    {
     error(31);
	 printf("数越界\n");
     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);
	  printf("表达式中漏了右括号)\n");
     }    
    }
    testdo(fsys,facbegsys,23);
   }
  }
 }
 return 0;
}

int condition(bool*fsys,int *ptx,int lev)
{
 enum symbol relop;
 bool nxtlev[symnum];
 if(sym==oddsym)
 {
  getsymdo;
  expressiondo(fsys,ptx,lev);
  gendo(opr,0,6);
 }
 else
 { 
  memcpy(nxtlev,fsys,sizeof(bool)*symnum);
  nxtlev[eql]=true;
  nxtlev[neq]=true;
  nxtlev[lss]=true;
  nxtlev[geq]=true;
  nxtlev[gtr]=true;
  nxtlev[leq]=true;
  expressiondo(nxtlev,ptx,lev);
  if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq)
  {
   error(20);
   printf("应为关系运算符\n");
  }
  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:
      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:
      s[t]=s[base(i.l,s,b)+i.a];
      t++;
      break;
    case sto:
  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;
      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 + -