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

📄 unit1.cpp

📁 编译原理的详细修改和实验报告。。修改了PL0语言的一些功能。。增加了一部分功能。里面有详细报告。。可供参详
💻 CPP
📖 第 1 页 / 共 3 页
字号:
          WNUMK=0;

          //GetSym();
          if(SYM!=SQRPAREN)
          Error(93);  //数组定义不正确

        }
        else Error(93);
        //if(arr)
}

//---------------------------------------------------------------------------
//生成虚拟机代码
void GEN(FCT X, int Y, int Z) {
  if (CX>CXMAX) {
    Form1->printfs("PROGRAM TOO LONG");
	fprintf(FOUT,"PROGRAM TOO LONG\n");
	fclose(FOUT);
    exit(0);
  }
  CODE[CX].F=X; CODE[CX].L=Y; CODE[CX].A=Z;
  CX++;
} /*GEN*/


//---------------------------------------------------------------------------
//测试当前符号是否合法
void TEST(SYMSET S1, SYMSET S2, int N) {
  if (!SymIn(SYM,S1)) {
    Error(N);
	while (!SymIn(SYM,SymSetUnion(S1,S2))) GetSym();
  }
} /*TEST*/


//---------------------------------------------------------------------------
//在名字表中加入一项
void ENTER(OBJECTS K, int LEV, int &TX, int &DX) { /*ENTER OBJECT INTO TABLE*/
  TX++;
  strcpy(TABLE[TX].NAME,ID); TABLE[TX].KIND=K;
  switch (K) {
	case CONSTANT:
	       if (NUM>AMAX) { Error(31); NUM=0; }
	       TABLE[TX].VAL=NUM;
	       break;
        case VARIABLE:
	       TABLE[TX].vp.LEVEL=LEV; TABLE[TX].vp.ADR=DX; DX++;
	       break;
	case PROCEDUR:
	       TABLE[TX].vp.LEVEL=LEV;
	       break;
  }
} /*ENTER*/


//---------------------------------------------------------------------------
//查找名字的位置
int POSITION(ALFA ID, int TX) { /*FIND IDENTIFIER IN TABLE*/
  int i=TX;
  strcpy(TABLE[0].NAME,ID);
  while (strcmp(TABLE[i].NAME,ID)!=0) i--;
  return i;
} /*POSITION*/


//---------------------------------------------------------------------------
//常量声明处理
void ConstDeclaration(int LEV,int &TX,int &DX) {
  if (SYM==IDENT||SYM==RPAREN) {
    GetSym();
    if (SYM==EQL||SYM==BECOMES) {
	  if (SYM==BECOMES) Error(1);
	  GetSym();
	  if (SYM==NUMBER) { ENTER(CONSTANT,LEV,TX,DX); GetSym(); }
	  else Error(2);
    }
    else Error(3);
  }
  else Error(4);
} /*ConstDeclaration()*/


//---------------------------------------------------------------------------
//变量声明处理
void VarDeclaration(int LEV,int &TX,int &DX) {
  if (SYM==IDENT||SYM==SEMICOLON) { ENTER(VARIABLE,LEV,TX,DX); GetSym(); }
  else Error(4);
} /*VarDeclaration()*/


//---------------------------------------------------------------------------
//输出目标代码清单
void ListCode(int CX0) {  /*LIST CODE GENERATED FOR THIS Block*/
  if (Form1->ListSwitch->ItemIndex==0)
    for (int i=CX0; i<CX; i++) {
      String s=IntToStr(i);
      while(s.Length()<3)s=" "+s;
      s=s+" "+MNEMONIC[CODE[i].F]+" "+IntToStr(CODE[i].L)+" "+IntToStr(CODE[i].A);
	  Form1->printfs(s.c_str());
	  fprintf(FOUT,"%3d%5s%4d%4d\n",i,MNEMONIC[CODE[i].F],CODE[i].L,CODE[i].A);
    }
} /*ListCode()*/;


//---------------------------------------------------------------------------
//因子处理
void FACTOR(SYMSET FSYS, int LEV, int &TX) {
  int i;
  TEST(FACBEGSYS,FSYS,24);
  while (SymIn(SYM,FACBEGSYS)) {
	if (SYM==IDENT) {
	  i=POSITION(ID,TX);
	  if (i==0) Error(11);
	  else
             switch (TABLE[i].KIND) {
		  case CONSTANT:
                        GEN(LIT,0,TABLE[i].VAL); break;
		  case VARIABLE:                               //添加
                        GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
              //          GetSym();
                        if(SYM==INC||SYM==DEC)
                        {
                         if(SYM==INC) GEN(OPR,0,17);
                         else
                           GEN(OPR,0,18);
                           GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                           GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                           GetSym();
                        }
                        break;
		  case PROCEDUR:
                        Error(21); break;
		}
	  GetSym();
	}
	else
	  if (SYM==NUMBER) {
		if (NUM>AMAX) { Error(31); NUM=0; }
		GEN(LIT,0,NUM); GetSym();
	  }
	  else
		if (SYM==LPAREN) {
		  GetSym(); EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX);
		  if (SYM==RPAREN) GetSym();
		  else Error(22);
		}

	  TEST(FSYS,FACBEGSYS,23);
  }
}/*FACTOR*/


//---------------------------------------------------------------------------
//项处理
void TERM(SYMSET FSYS, int LEV, int &TX) {  /*TERM*/
  SYMBOL MULOP;
  FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH)), LEV,TX);
  while (SYM==TIMES || SYM==SLASH) {
	MULOP=SYM;  GetSym();
	FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH)),LEV,TX);
	if (MULOP==TIMES) GEN(OPR,0,4);
	else GEN(OPR,0,5);
  }
} /*TERM*/;


//---------------------------------------------------------------------------
//表达式处理
void EXPRESSION(SYMSET FSYS, int LEV, int &TX) {
  SYMBOL ADDOP;
  if (SYM==PLUS || SYM==MINUS) {
    ADDOP=SYM; GetSym();
    TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
    if (ADDOP==MINUS) GEN(OPR,0,1);
  }
  else TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
  while (SYM==PLUS || SYM==MINUS) {
    ADDOP=SYM; GetSym();
    TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
    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);
     GEN(OPR,0,6);
  }
  else {
	EXPRESSION(SymSetUnion(SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ,PLUSBK,MINUSBK),FSYS),LEV,TX);
	if (!SymIn(SYM,SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ,PLUSBK,MINUSBK))) Error(20);
	else {
	  RELOP=SYM; GetSym();               //5
          EXPRESSION(FSYS,LEV,TX);
	  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;
            case PLUSBK:  GEN(OPR,0,14); break;
            case MINUSBK: GEN(OPR,0,15); break;
	  }
	}
  }
} /*CONDITION*/


//---------------------------------------------------------------------------
//语句处理
void STATEMENT(SYMSET FSYS,int LEV,int &TX) {   /*STATEMENT*/
  int i,CX1,CX2,CX3,tm=0,jk=0;
  FCT STOMode[3]={STO,STOARR,STOVAR};
  FCT LODMode[3]={LOD,LODARR,LODVAR};
  SYMBOL Temp;
  switch (SYM) {
	case IDENT:
		i=POSITION(ID,TX);
		if (i==0) Error(11);
		else
		  if (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT TO NON-VARIABLE*/
			Error(12); i=0;
		  }
               GetSym();
               switch(SYM)
               {                     //添加INC,DEC,PLUSBK,MINUSBK
                case BECOMES:
                        GetSym();
                        EXPRESSION(FSYS,LEV,TX);
                        if(i!=0) GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                        break;
                case INC:  //++运算
                         GetSym();
                         GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
                         GEN(LIT,0,1);
                         GEN(OPR,0,2);
                         GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
                         break;
                case DEC:  //--运算
                         GetSym();
                         GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
                         GEN(LIT,0,1);
                         GEN(OPR,0,3);
                         GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
                        break;
                case PLUSBK:
                case MINUSBK:
                        int flag=SYM; //flag是一个局部整型变量
                        GetSym();
                        GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                        EXPRESSION(FSYS,LEV,TX);
                        if(flag==PLUSBK) GEN(OPR,0,2);
                        else GEN(OPR,0,3);
                             GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                        break;
              //  default: Error(13); GetSym();
               }
		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(33);
		  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);
			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);
		  GetSym();
                  if(SYM==LPAREN)
                  {
                     GetSym();
                     int k=0;
                       EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
                       GEN(PUSH,0,k);
                       k++;
                       while(SYM==COMMA)
                       {
                          GetSym();
                          EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
                          GEN(PUSH,0,k);
                          k++;
                       }
                       if(SYM==RPAREN)   GetSym();
                       else     Form1->printls("错误CALL",400);

              //String s=IntToStr(i);
              //Form1->printls(s.c_str(),700);

                       GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                  }
                  else
                  {
                        if (TABLE[i].KIND==PROCEDUR)
			  GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
			else Error(15);
                          
                  }

  		}
		break;

	case IFSYM:
		GetSym();
		CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM,ELSESYM),FSYS),LEV,TX);
		if (SYM==THENSYM) GetSym();
		else Error(16);
		CX1=CX;
                  GEN(JPC,0,0);
		STATEMENT(SymSetUnion(SymSetNew(IDENT,ELSESYM,SEMICOLON),FSYS),LEV,TX);
               if(SYM!=SEMICOLON) Form1->printls("错误IF",300);
               else    GetSym();
               if(SYM!=ELSESYM)
               {
                 b=1;
                 CODE[CX1].A=CX;
                 return;
               }
               else                                     //6 添加else
               {
                  GetSym();
                  CX2=CX;
                  GEN(JMP,0,0);
                  STATEMENT(FSYS,LEV,TX);
                  CODE[CX1].A=CX2+1;
                  CODE[CX2].A=CX;
                }
               break;

	case BEGINSYM:
		GetSym();
		STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX);

⌨️ 快捷键说明

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