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

📄 控制.cpp

📁 八、 设计SAMPLE语言的语法、语义分析器
💻 CPP
字号:
#include"头文件.h"
extern int nowaddress;//表示下一个地址
extern bianYi parse;            //词法分析
extern item sign;            //
extern fouryuan FOMO;         //四元组表
extern suanfu_stack STACK;     //布朗运算的栈


extern valuetable VT;          //变量表

state sentence(){
   state temp;
   switch(sign.x){

       case 23:{//programme 
		            item signtemp=sign;
                    getnextsign();
                    if(sign.x!=36)error();
					FOMO.load(nowaddress,signtemp,sign,sign,sign);
					nowaddress++;
                    getnextsign();
                    if(sign.x!=52)error();
                    getnextsign();
                    temp=St();
	//				if(sign.x!=52)error();
	//				getnextsign();
					sentence();
					break;
               }
	   case 34:{//while
		   temp=while_T();
		   break;
			   }
	   case 36:{
		   temp=fuzhi_E();
		   break;
			   }
       case 3:{//begin
		   temp=mulsentence();
		   break;
			  }
	   case 15:{//if
		   temp=if_E();
		   break;
			   }
	   case 26:{
		   temp=repeat_E();
		   break;
			   }
	  default :error();
   }
   return temp;
}
state St(){
	state temp;
   switch(sign.x){
       case 33:{
                    getnextsign();
                    valueDefine();
					K();
                    break;
//////////////////////////////////
               }
       default :break;
   }
   return temp;
}
state K(){
	state temp;
	switch(sign.x){
	case 36:{
		valueDefine();
		break;
			}
	default:break;
	}
	return temp;
}
valuetype valueDefine(){
   valuetype temp;
   if(sign.x!=36)error();
   temp.location=sign.y;
   getnextsign();

   temp.type=(L()).type;
   VT.add(temp);
   return temp;
}
valuetype L(){
   valuetype temp;
   switch(sign.x){
      case 44:{
                     getnextsign();
                //     if(sign.x!=36)error();
                     temp.type=(valueDefine()).type;
                     break;
               }
      case 50:{
                     getnextsign();
                     temp.type=(T()).type;
                     break;
               }
      default :error();
    }
    return temp;
}
valuetype T(){
   valuetype temp;
   switch(sign.x){
        case 17:{
                      temp.type=17;
					  getnextsign();
					  if(sign.x!=52)error();
					  getnextsign();
                      break;
                }
		case 4:{
			          temp.type=4;
					  getnextsign();
					  if(sign.x!=52)error();
					  getnextsign();
					  break;
			   }
        default: error();
    }
    return temp;
}


/*
while_W->while
while_C->while_W boolean_E do
while_T->while_C S
*/
state S(){
	state temp;
	return temp;

};
state::state(){
	chain[0]=0;
	codebegin=nowaddress;
};
state::state(const state & temp){
	for(int i=0;i<temp.chain[0]+1;i++){
		chain[i]=temp.chain[i];
	}
	codebegin=temp.codebegin;
}
state& state::merge(int cs[],int cd[]){
           for(int i=0;i<cs[0]+1;i++)
               chain[i]=cs[i];
           for(i=1;i<cd[0]+1;i++)
               chain[i+cs[0]]=cd[i];
		   chain[0]=cs[0]+cd[0];
           return*this;
}
state&state::operator=(state &temp){
	for(int i=0;i<temp.chain[0]+1;i++)
		chain[i]=temp.chain[i];
	codebegin=temp.codebegin;
	return *this;
}
state while_W(){
      state temp;
      temp.codebegin=nowaddress;
      if(sign.x!=34)error();
      return temp;
}
state while_C(){
      state temp;
      //temp.codebegin=nowaddress;
      state tempw=while_W();
      getnextsign();
      TFL tempe=boolean_E();
    //  getnextsign();
      if(sign.x !=10)error();
      FOMO.writeback(tempe.headt,nowaddress);
	  /////////将布朗运算的FALSE连作为连
	  for(int zz=0;zz<tempe.headf[0]+1;zz++)
		  temp.chain[zz]=tempe.headf[zz];
      temp.codebegin=tempw.codebegin;
      return temp;
}
state while_T(){
	  STACK.suanfu_clear();
      state temp;
      state tempc=while_C();
      getnextsign();
      state temps=sentence();     
      FOMO.writeback(temps.chain,tempc.codebegin);
      FOMO.load(nowaddress,tempc.codebegin);
	  nowaddress++;
//	  cout<<"goto        ,"<<endl;
      temp=tempc;
      return temp;
}
/*
if_C->if boolean_E then
if_T->if_C S else
if_E->if_T S
*/
state if_E(){
	STACK.suanfu_clear();
	state temp;
	state tempt=if_T();
	getnextsign();
	state temps=sentence();
	//FOMO.writeback(tempt.chain,temps.codebegin);
	temp.merge(temps.chain,tempt.chain);
	temp.codebegin=tempt.codebegin;
	return temp;
}
state if_C(){
    state temp;
    switch(sign.x){
       case 15:{
             getnextsign();
             TFL tempe=boolean_E();
             FOMO.writeback(tempe.headt,nowaddress);
			 for(int zz=0;zz<tempe.headf[0]+1;zz++)
		         temp.chain[zz]=tempe.headf[zz];
             temp.codebegin=tempe.codebegin;           
             //getnextsign();
             if(sign.x!=29)error();
             break;
        }
	   default :error();
    }
	return temp;
}
state if_T(){
    state temp;
    state tempc=if_C();
    getnextsign();
    state temps=fuzhi_E();/////////////
  //  getnextsign();
    if(sign.x!=11)error();
    int q=nowaddress;
    FOMO.load(nowaddress,0);
	nowaddress++;
    FOMO.writeback(tempc.chain,nowaddress);
	int tempq[2];
	tempq[0]=1;
	tempq[1]=q;
    temp.merge(temps.chain,tempq);
    return temp;
}
/*
repeat_E->repeat_T E
repeat_T->repeat_B S until
repeat_B->repeat
*/
state repeat_B(){
      state temp;
      temp.codebegin=nowaddress;
      if(sign.x!=26)error();
      return temp;
}
state repeat_T(){
      state temp;
      //temp.codebegin=nowaddress;
      temp=repeat_B();
      getnextsign();
      state temps=sentence();
    //  getnextsign();
      if(sign.x !=32)error();
      FOMO.writeback(temps.chain,nowaddress);
      return temp;
}
state repeat_E(){
	  STACK.suanfu_clear();
      state temp;
      state tempt=repeat_T();
      getnextsign();
      TFL temptfl=boolean_E();     
      FOMO.writeback(temptfl.headf,tempt.codebegin);
 //     FOMO.load(nowaddress,tempt.codebegin);
//	  nowaddress++;
//	  cout<<"goto        ,"<<endl;
      for(int zz=0;zz<temptfl.headt[0]+1;zz++)
		  temp.chain[zz]=temptfl.headt[zz];
      temp.codebegin=tempt.codebegin;
      return temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -