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

📄 unit1.~cpp

📁 我在三做的课程
💻 ~CPP
📖 第 1 页 / 共 3 页
字号:
            num1=TABLE[m].VAL;         //则把其值赋给num1
            else   {Error(41);m=0;}    //否则出错并致m为0
            GetSym();
            if(SYM==MIDD)  GetSym();//如果下界的下一个标识符为‘~’,则再取下一个
            if(SYM==NUMBER)
           {        //如果数组的上界为数字
      		 DX=DX+NUM-num1+1;// 计算数组的长度并留出空间,移动指针                     
		  GetSym();               
            }
            else
	{            //如果数组的上界为标识符 m=POSITION(ID,TX); //查找标识符的位置             
           		  if(m==0) Error(11);              
            	  else if(TABLE[m].KIND==CONSTANT) //如果标识符为常量
                          k=TABLE[m].VAL;             //则把其值赋给k                  
                          else  
		 {
	             	 Error(41);m=0;
                          }   //否则出错并致m为0                 
                          DX=DX+k-num1+1;          // 计算数组的长度并留出空间,移动指针              
                         GetSym();             
             }             
    }
 if(SYM==RSQUARE)   //如果标识符为数组的符号‘]’,则取下一个单词       
 GetSym();
 else Error(61); 
  }   //否则数组中漏掉括号‘]’
}
 /*VarDeclaration()*/
//---------------------------------------------------------------------------
void CharDeclaration(int LEV,int &TX,int &DX) {
  if (SYM==IDENT) { ENTER(CHARCON,LEV,TX,DX); GetSym(); }
  else Error(4);
} /*CharDeclaration()*/
//---------------------------------------------------------------------------
void RealDeclaration(int LEV,int &TX,int &DX) {
  if (SYM==IDENT) { ENTER(REALCON,LEV,TX,DX); GetSym(); }
  else Error(4);
} /*RealDeclaration()*/
//---------------------------------------------------------------------------
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((int)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,j,tag=0;   //用tag作为数组的标志,置初值为0
  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: GetSym();GEN(LIT,0,TABLE[i].VAL); break;
		  case VARIABLE: GetSym();
                                if(SYM==LSQUARE)//如果标识符为数组的开始符号‘[’
				{
					GetSym();  //则读下一个单词
					if(SYM==NUMBER)
					{
                                                FTE=NUM;
						GetSym();
					}     //把数组的下标赋给j和FTE
                                        else if(SYM==IDENT)
                                        {
                                                j=POSITION(ID,TX);
                                                FTE=TABLE[j].VAL;
                                                GetSym();
                                        }
                                        else  Error(60);
					if(SYM==RSQUARE)
					{
 					       GetSym();
                                               tag=1;
					}      //如果数组的结束符号正确则置tag为1表示数组存在
					else Error(61);
                                        GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+FTE);     //把数组元素放在栈顶
				        FTE=0;
                                }
                                else    GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                                break;
		  case PROCEDUR: GetSym();Error(21); break;
                  case CHARCON:  GetSym();GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);break;
                  case REALCON:  GetSym();GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);break;
		}
          if(SYM==PLPL)
          {
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GEN(LIT,0,1);
                GEN(OPR,0,2);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GetSym();
          }
          if(SYM==MIMI)
          {
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GEN(LIT,0,1);
                GEN(OPR,0,3);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                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);
		}
          else
                if(SYM==PLPL){
                GetSym();
                i=POSITION(ID,TX);
                if (i==0) Error(11);
                else
                if (TABLE[i].KIND!=VARIABLE)
                {       /*ASSIGNMENT TO NON-VARIABLE*/
                        Error(12); i=0;
                }
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GEN(LIT,0,1);
                GEN(OPR,0,2);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GetSym();
                }
          else
                if(SYM==MIMI)
                {
                        GetSym();
                        i=POSITION(ID,TX);
                         if (i==0) Error(11);
                         else
                         if (TABLE[i].KIND!=VARIABLE)
                         {       /*ASSIGNMENT TO NON-VARIABLE*/
                                    Error(12); i=0;
                         }
                        GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                 GEN(LIT,0,1);
                 GEN(OPR,0,3);
                 GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                 GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                 GetSym();
                }
	  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),FSYS),LEV,TX);
	if (!SymIn(SYM,SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ))) Error(20);
	else {
	  RELOP=SYM; GetSym(); 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;
	  }
	}
  }
} /*CONDITION*/
//---------------------------------------------------------------------------
void STATEMENT(SYMSET FSYS,int LEV,int &TX) {   /*STATEMENT*/
  int  i,j,j1,j2,CX1,CX2,STE,STE1,tag=0;
  switch (SYM) {
	case IDENT:
	i=POSITION(ID,TX);
        if (i==0) Error(11);
        if (TABLE[i].KIND==CHARCON)
        {
                GetSym();
                if(SYM!=BECOMES)  Error(13);
                else
                {
                      GetSym();
                      if(SYM!=CHARS) Error(32); //类型出错
                      else
                      {
                        GEN(LIT,0,NUM);
                        GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                      }
                }
                    GetSym();break;
        }
         if (TABLE[i].KIND==REALCON)
        {
                GetSym();
                if(SYM!=BECOMES)  Error(13);
                else
                {
                        GetSym();
                        GEN(LIT,0,NUM);
                        GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                }
                    GetSym();break;
        }
        if (TABLE[i].KIND==VARIABLE)
        {
          GetSym();
          if (SYM==BECOMES)
          {
                GetSym();
                EXPRESSION(FSYS,LEV,TX);
                if (i!=0) GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                TABLE[i].VAL=NUM;
          }

          else if(SYM==PLEQ)
          {
                GetSym();
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                EXPRESSION(FSYS,LEV,TX);
                GEN(OPR,0,2);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
          }
          else if(SYM==MIEQ)
          {
                GetSym();
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                EXPRESSION(FSYS,LEV,TX);
                GEN(OPR,0,3);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
          }
          else if(SYM==PLPL)
          {
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GEN(LIT,0,1);
                GEN(OPR,0,2);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                TABLE[i].VAL=NUM;
                GetSym();
          }
          else if(SYM==MIMI)
          {
                GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                GEN(LIT,0,1);
                GEN(OPR,0,3);
                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                TABLE[i].VAL=NUM;
                GetSym();
          }
	   else  if(SYM==LSQUARE)
           {                    //若语句的标识符后为'['
                 GetSym();
                 if(SYM==NUMBER)
                 {
                        j1=STE=NUM;
                        GetSym();
                 }
                 else if(SYM==IDENT)
                 {      j2=POSITION(ID,TX);
                        j1=TABLE[j2].VAL;
                        GetSym();
                 }
                 else  Error(60);
                 if(SYM==RSQUARE)
                 {
  	  		GetSym();
  			tag=1;
                 }  //判断下标后是否为']'
                 else Error(61);
                 if (SYM==BECOMES)
                 {
                         GetSym();
                         EXPRESSION(FSYS,LEV,TX);
                         if (i!=0) GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+j1);
                         TABLE[i].VAL=NUM;
                 }
                 else Error(13);
           }
           }
           else Error(13);
           break;

        case READSYM:
             GetSym();
             if (SYM!=LPAREN) Error(34);
             else
                do
                {
                        GetSym();
                        if (SYM==IDENT) j=POSITION(ID,TX);    //记下标识符的位置j
                        else j=0;
                        if (j==0) Error(35);
                        else {
                                GetSym();
                                if(TABLE[j].KIND==VARIABLE)
                                {
                                        i=j;         //读下一个单词并把j的值赋予i
                                        if(SYM==LSQUARE)
                                        {
                                                i=POSITION(ID,TX);  //如果下个单词为数组的符号‘[’
                                                GetSym();                        //记下数组的位置i
                                                if(SYM==NUMBER)
                                                j=NUM;                          //加下数组的下标把它赋给j
                                                GetSym();
                                                if(SYM!=RSQUARE) Error(2);
                                                GetSym();
                                                GEN(OPR,0,16);                   //输入数值
                                                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+j); //把结果送回变量单元
                                        }
                                        else
                                        {	//单词不为数组的开始符号,则执行下列语句
                                                GEN(OPR,0,16);
                                                GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
                                                TABLE[i].VAL=NUM;
                                        }
                                }
                                if(TABLE[j].KIND==CHARCON)
                                {
                                        GEN(OPR,0,21);
                                        GEN(STO,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                                }
                                if(TABLE[j].KIND==REALCON)
                                {
                                        GEN(OPR,0,20);
                                        GEN(STO,LEV-TABLE[j].vp.LEVEL,TABLE[j].vp.ADR);
                                }

                        }
                }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();
                        if(SYM==IDENT)
                        {
                          int ii=POSITION(ID,TX);
                          if(TABLE[ii].KIND==CHARCON)
                          {
			        EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
			        GEN(OPR,0,19);
                          }
                          if(TABLE[ii].KIND==VARIABLE)
                          {
                                EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
			        GEN(OPR,0,14);
                          }
                           if(TABLE[ii].KIND==REALCON)
                          {
                                EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
			        GEN(OPR,0,14);
                          }
                       }
                       else
                       {
                                EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
			        GEN(OPR,0,14);
                       }
		  }while(SYM==COMMA);
		  if (SYM!=RPAREN) Error(33);
		  else GetSym();
		}
		break; /*WRITESYM*/
	case CALLSYM:
		GetSym();
		if (SYM!=IDENT) Error(14);
		else
                {

⌨️ 快捷键说明

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