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

📄 unit1.cpp

📁 PL0功能的扩充编译原理课程设计:扩充赋值运算:+= 和-=
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		GEN(LIT,0,NUM); GetSym();
	  }
	else //整型值
	  if (SYM==NUMBER&&KIND==Int) {
                if(type!=Int&&type!=notype)Error(104);
		if (NUM>AMAX) { Error(31); NUM=0; }
		GEN(LIT,0,NUM); GetSym();
	  }
          else//REAL型值
	  if (SYM==NUMBER&&KIND==REAL) {
                if(type!=REAL&&type!=notype)Error(104);
		if (NUM>AMAX) { Error(31); NUM=0; }
		GEN(LIT,0,NUM); GetSym();
	  }
	  else
		if (SYM==LPAREN) {
		  GetSym(); EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX,type);
		  if (SYM==RPAREN) GetSym();
		  else Error(22);
		}
           else
                if(SYM==ADDADD||SYM==JIANJIAN) {
                    TEMP=SYM;
                    GetSym();
                    if(SYM!=IDENT)Error(95);
                    else{
                      n=FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH)),LEV,TX,type);
                      GEN(LIT,0,1);
                      if(TEMP==ADDADD)GEN(OPR,0,2);
                      else GEN(OPR,0,3);
                      GEN(STO,TABLE[n].vp.LEVEL,TABLE[n].vp.ADR);
                      GEN(LOD,LEV-TABLE[n].vp.LEVEL,TABLE[n].vp.ADR);

                      }

                      }
	  TEST(FSYS,FACBEGSYS,23);
  }
  return i;
}/*FACTOR*/
//---------------------------------------------------------------------------
void TERM(SYMSET FSYS, int LEV, int &TX,int type) {  /*TERM*/
  SYMBOL MULOP,TEMP;
  int i;

  i=FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH,ADDADD)), LEV,TX,type);

  if(SYM==ADDADD||SYM==JIANJIAN) {TEMP=SYM;
        GEN(LIT,0,1);
        if(TEMP==ADDADD)GEN(OPR,0,2);
        else  GEN(OPR,0,3);
        GEN(STO,TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
        GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
        GEN(LIT,0,1);
        if(TEMP==ADDADD)GEN(OPR,0,3);
        else GEN(OPR,0,2);

        GetSym();}
  while (SYM==TIMES || SYM==SLASH) {
	MULOP=SYM;  GetSym();
	FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH,ADDADD)),LEV,TX,type);
         if(SYM==ADDADD||SYM==JIANJIAN) {TEMP=SYM;
        GEN(LIT,0,1);
        if(TEMP==ADDADD)GEN(OPR,0,2);
        else  GEN(OPR,0,3);
        GEN(STO,TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
        GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
        GEN(LIT,0,1);
        if(TEMP==ADDADD)GEN(OPR,0,3);
        else GEN(OPR,0,2);

        GetSym();}
	if (MULOP==TIMES) GEN(OPR,0,4);
	else GEN(OPR,0,5);
  }
} /*TERM*/;
//---------------------------------------------------------------------------

void EXPRESSION(SYMSET FSYS, int LEV, int &TX,int type) {

  SYMBOL ADDOP;

  if (SYM==PLUS || SYM==MINUS) {
    ADDOP=SYM;
    GetSym();
    TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX,type);
    if (ADDOP==MINUS)
    GEN(OPR,0,1);
  }
  else TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX,type);
  while (SYM==PLUS || SYM==MINUS) {
    ADDOP=SYM;
    GetSym();
    TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX,type);
    if (ADDOP==PLUS)
      GEN(OPR,0,2);
    else
      GEN(OPR,0,3);

  }
} /*EXPRESSION*/
//---------------------------------------------------------------------------
void CONDITION(SYMSET FSYS,int LEV,int &TX) {
  SYMBOL RELOP;
  if (SYM==ODDSYM) { GetSym(); EXPRESSION(FSYS,LEV,TX,notype); GEN(OPR,0,6); }
  else {
	EXPRESSION(SymSetUnion(SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ),FSYS),LEV,TX,notype);
	if (!SymIn(SYM,SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ))) Error(20);
	else {
	  RELOP=SYM; GetSym(); EXPRESSION(FSYS,LEV,TX,notype);
	  switch (RELOP) {
	    case EQL: GEN(OPR,0,8);  break;
	    case NEQ: GEN(OPR,0,9);  break;
	    case LSS: GEN(OPR,0,10); break;
	    case GEQ: GEN(OPR,0,11); break;
	    case GTR: GEN(OPR,0,12); break;
	    case LEQ: GEN(OPR,0,13); break;
	  }
	}
  }
} /*CONDITION*/
//---------------------------------------------------------------------------
//对调用函数的处理
void FUCTIONDO(SYMSET FSYS,int LEV,int &TX){
int i=POSITION(ID,TX);
     GEN(INI,0,1);      GetSym();
                     if(SYM==LPAREN)GetSym();
                     else Error(109);
                     //if(TABLE[i].vp.FP->Passnum!=0)
                     for(int j=i+1,m=0;TABLE[i].vp.FP->Passnum>m&&SYM!=RPAREN;j++,m++)
                     {
                         switch(SYM)
                         {
                           case NUMBER:
                                       if(KIND==TABLE[j].KIND) {
                                          CODE[TABLE[i].vp.FP->CX[m]].A=NUM;

                                       }
                                       else Error(110);
                                       break;
                           case CHARNUM:
                                        if(KIND==TABLE[j].KIND) {
                                          CODE[TABLE[i].vp.FP->CX[m]].A=NUM;

                                       }
                                       else Error(111);
                                       break;
                           case IDENT:
                                       int x=POSITION(ID,TX);String s=ID;
                                       if(TABLE[x].vp.ADR!=2)
                                       if(TABLE[x].KIND==TABLE[j].KIND) {
                                          CODE[TABLE[i].vp.FP->CX[m]].A=TABLE[x].vp.ADR;
                                          CODE[TABLE[i].vp.FP->CX[m]].L=TABLE[i].vp.LEVEL-TABLE[x].vp.LEVEL+1;

                                      }
                                      else Error(112);
                                       break;
                         }//switch
                     } //for
                     GEN(CAL,LEV-TABLE[i].vp.LEVEL,2);


}
//----------------------------------------------------------------------
void STATEMENT(SYMSET FSYS,int LEV,int &TX,int TX0) {   /*STATEMENT*/
  int i,CX1,CX2,DX1;
  SYMBOL TEMP;
  switch (SYM) {
	case IDENT:
		i=POSITION(ID,TX);
		if (i==0) Error(11);
		else
		  if (TABLE[i].KIND==CONSTANT) { /*ASSIGNMENT TO NON-VARIABLE*/
		 	Error(12); i=0;
		  }
                else
                  if(TABLE[i].KIND==PROCEDUR||TABLE[i].KIND==FUCTIONC)
                  {

                     GetSym();
                     if(SYM==BECOMES) //处理对函数名的赋值语句
                     {  GetSym();
                        if(SYM==NUMBER)
                        {
                          GEN(LIT,0,NUM);
                          GEN(STO,0,TABLE[i].vp.ADR);
                        }
                        else
                           if(SYM==IDENT)
                           {
                             int n=POSITION(ID,TX);
                             //if( TABLE[n].KIND==TABLE[i].KIND){

                             GEN(LOD,LEV-TABLE[n].vp.LEVEL,TABLE[n].vp.ADR);
                             GEN(STO,0,TABLE[i].vp.ADR);
                             //}
                             //else Error(112);
                           }
                           GetSym();
                           return;
                     }
                     GEN(INI,0,1); //对调用函数的处理
                     if(SYM==LPAREN)GetSym();
                     else Error(109);
                     for(int j=i+1,m=0;j<=TABLE[i].vp.FP->Passnum&&SYM!=RPAREN;j++,m++)
                     {
                         switch(SYM)
                         {
                           case NUMBER:
                                       if(KIND==TABLE[j].KIND) {
                                          CODE[TABLE[i].vp.FP->CX[m]].A=NUM;

                                       }
                                       else Error(110);
                                       break;
                           case CHARNUM:
                                        if(KIND==TABLE[j].KIND) {
                                          CODE[TABLE[i].vp.FP->CX[m]].A=NUM;

                                       }
                                       else Error(111);
                                       break;
                           case IDENT:
                                       int x=POSITION(ID,TX);
                                       if(TABLE[x].KIND==TABLE[j].KIND) {
                                          CODE[TABLE[i].vp.FP->CX[m]].A=TABLE[x].vp.ADR;
                                          CODE[TABLE[i].vp.FP->CX[m]].L=TABLE[i].vp.LEVEL-TABLE[x].vp.LEVEL+1;

                                       }
                                       else Error(112);
                                       break;
                         }//switch
                     } //for
                     GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);

                  }

                else
                  if(TABLE[i].KIND==ARRAY){
                     GetSym();
                     if(SYM!=LZPAREN)Error(105);
                         GetSym();
                     if(SYM==NUMBER&&KIND==Int)DX1=NUM-1;
                     else
                        Error(105);
                     GetSym();
                     if(SYM!=RZPAREN)Error(105);
                     }
        GetSym();
                if(SYM==ADDADD||SYM==JIANJIAN)
                {

                   if (i!=0){
                    if(TABLE[i].KIND==ARRAY)
                      GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+DX1);
                    else
                      GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                      }
                      GEN(LIT,0,1);
                  if(SYM==ADDADD)
                     GEN(OPR,0,2);
                  else
                     GEN(OPR,0,3);
                  GetSym();

                }//
                else{
		   if (SYM==BECOMES){GetSym();if(SYM==YINHAO)GetSym();  }
                   else
                      if(SYM==ADDNEQ||SYM==JIANNEQ) {
                   if(TABLE[i].KIND==ARRAY)
                      GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+DX1);
                   else
                      GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                   if(SYM==ADDNEQ)TEMP=ADDNEQ;
                   else TEMP=JIANNEQ;
                   GetSym();

                  }

                 else Error(13);//这里还要修改出错

		EXPRESSION(FSYS,LEV,TX,TABLE[i].KIND);
                if(TEMP==ADDNEQ)
                GEN(OPR,0,2);
                else if(TEMP==JIANNEQ)
                GEN(OPR,0,3); }
		if (i!=0){
                    if(TABLE[i].KIND==ARRAY)
                      GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+DX1);
                    else
                      GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                      }
		break;
	case READSYM:
		GetSym();
		if (SYM!=LPAREN) Error(34);
		else
		  do {
			GetSym();
			if (SYM==IDENT) i=POSITION(ID,TX);
			else i=0;
			if (i==0) Error(35);
			else {
			  GEN(OPR,0,16);
			  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
			}
			GetSym();
		  }while(SYM==COMMA);
		if (SYM!=RPAREN) {
		  Error(34);
		  while (!SymIn(SYM,FSYS)) GetSym();
		}
		else GetSym();
		break; /* READSYM */
        case WRITESYM:
		GetSym();
		if (SYM==LPAREN) {
		  do {
			GetSym();
			EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX,notype);

                     GEN(OPR,0,14);
		  }while(SYM==COMMA);
		  if (SYM!=RPAREN) Error(33);
		  else GetSym();
		}

		GEN(OPR,0,15);
		break; /*WRITESYM*/
	case CALLSYM:
		GetSym();
		if (SYM!=IDENT) Error(14);
		else {
		  i=POSITION(ID,TX);
		  if (i==0) Error(11);
		  else
			if (TABLE[i].KIND==PROCEDUR)
			  GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
			else Error(15);
		  GetSym();
		}
		break;
	case IFSYM:
		GetSym();
		CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);
		if (SYM==THENSYM) GetSym();
		else Error(16);
		CX1=CX;
                GEN(JPC,0,0);
		STATEMENT(FSYS,LEV,TX,TX0);
                GetSym();

                if(SYM==ELSESYM)
                {
                   CX2=CX;
                   GEN(JMP,0,0);
                   CODE[CX1].A=CX;
                   GetSym();
                   STATEMENT(FSYS,LEV,TX,TX0);
                   CODE[CX2].A=CX;
                }
                //else
                  //CODE[CX1].A=CX;

		break;
	case BEGINSYM:

		GetSym();
                if(TABLE[TX0].vp.FP!=NULL)//过程或函数带参
                {
                  for(int n=0;n<TABLE[TX0].vp.FP->Passnum;n++)//  生成填充实参的指令
                   {
                    TABLE[TX0].vp.FP->CX[n]=CX;
                    GEN(LOD,0,21);
                    GEN(STO,LEV-TABLE[TX0+n+1].vp.LEVEL,TABLE[TX0+n+1].vp.ADR);
                   }
                }
		STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX,TX0);
		while (SymIn(SYM, SymSetAdd(SEMICOLON,STATBEGSYS))) {
		  if (SYM==SEMICOLON) GetSym();
                  else
                   Error(10);
                  if(SYM==ENDSYM)break; //自己加上去,值得仔细考虑 ,不加也可以,
                  //把DEFAULT去掉,这样ENDSYM就没有处理,返回WHILE时不满足循环
                  //条件 ,所以不会继续循环
                STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX,TX0);
		}
		if (SYM==ENDSYM) GetSym();
		else Error(17);
		break;
	case WHILESYM:
		CX1=CX; GetSym(); CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX);
		CX2=CX; GEN(JPC,0,0);
		if (SYM==DOSYM) GetSym();
		else Error(18);
		STATEMENT(FSYS,LEV,TX,TX0);
		GEN(JMP,0,CX1);
		CODE[CX2].A=CX;
		break;
        case REPEATSYM:
                GetSym();
                CX1=CX;
              STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,UNTILSYM),FSYS),LEV,TX,TX0);
               GetSym();
               if(SYM!=UNTILSYM)Error(36);
               else{
               GetSym();
               CONDITION(SymSetUnion(SymSetNew(SEMICOLON),FSYS),LEV,TX);

               GEN(JPC,0,CX1); }
               break;
         case FORSYM:
              SYMBOL TOD;
              GetSym();
              if(SYM!=IDENT)Error(99);
              else{
              //-------------------
                 i=POSITION(ID,TX);
		if (i==0) Error(11);
		else
		  if (TABLE[i].KIND==PROCEDUR||TABLE[i].KIND==CONSTANT) { /*ASSIGNMENT TO NON-VARIABLE*/
			Error(12); i=0;
		  }
                GetSym();
		if (SYM==BECOMES) GetSym();

⌨️ 快捷键说明

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