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

📄 yuyi.cpp

📁 递归下降方法实现的类C语言的语义分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

void B()
{
    char idname[4];
    int B1_falselist, B1_truelist;

	switch(currword)
	{
	    case 17:
            fscanf(p, "%d %d", &currword, &entry);
			B();
			//执行语义动作
			//{B1.truelist = B.falselist;
			// B1.falselist = B.truelist;}
			//*********************************
			   B1_falselist = B_truelist;
			   B1_truelist = B_falselist;
			//*********************************
			B1(B1_truelist, B1_falselist);
            //执行语义动作
			//{B.truelist = B1.tlist;
			// B.falselist = B1.flist;
			//*****************************
			  B_truelist = B1_tlist;
			  B_falselist = B1_flist;
			//*****************************
			break;
		case 28:
		    fscanf(p, "%d %d", &currword, &entry);
			B();
			if(currword == 29)
			{
				//执行语义动作
			    //{B1.truelist = B.falselist;
			    // B1.falselist = B.truelist;}
			    //*********************************
			      B1_falselist = B_truelist;
			      B1_truelist = B_falselist;
			    //*********************************
				fscanf(p, "%d %d", &currword, &entry);
				B1(B1_truelist, B1_falselist);
			    //执行语义动作
			    //{B.truelist = B1.tlist;
			    // B.falselist = B1.flist;
			    //*****************************
			      B_truelist = B1_tlist;
			      B_falselist = B1_flist;
			    //*****************************
			}
			else
			{
			    printf("Error! “)” lost\n");
			}
			break;
		case 7:
			//执行语义动作
			//{B.truelist = makelist(nextquad);
			// emit(j, , , );
			//**********************
			  B_truelist = sencount;
			  write("j"," "," "," ");
			//**********************
              B1_falselist = B_falselist;
			  B1_truelist = B_truelist;

			fscanf(p, "%d %d", &currword, &entry);
			B1(B1_truelist, B1_falselist);
            //执行语义动作
			//{B.truelist = B1.tlist;
			// B.falselist = B1.flist;
			//*****************************
			  B_truelist = B1_tlist;
			  B_falselist = B1_flist;
			//*****************************
			break;
		case 8:
			//执行语义动作
			//{B.falselist = makelist(nextquad);
			// emit(j, , , );
			//**********************
			  B_falselist = sencount;
			  write("j"," "," "," ");
			//**********************
              B1_falselist = B_falselist;
			  B1_truelist = B_truelist;

			fscanf(p, "%d %d", &currword, &entry);
			B1(B1_truelist, B1_falselist);
			//执行语义动作
			//{B.truelist = B1.tlist;
			// B.falselist = B1.flist;
			//*****************************
			  B_truelist = B1_tlist;
			  B_falselist = B1_flist;
			//*****************************
			break;
		case 11:
            strcpy(idname, ST.SB[entry].idname);
			fscanf(p, "%d %d", &currword, &entry);
			relop(idname);
			E(entry);
			//执行语义动作
			//{B.truelist = makelist(nextquad);
			// B.falselist = makelist(nextquad + 1);
			// emit(relop.op, relop.id, E.place,  )
			// emit(j, , , ,)}
			//**************************************
			  B_truelist = sencount;
			  B_falselist = sencount + 1;
              write(relop_op, relop_id, E_place, " ");
			  write("j", " ", " ", " ");
			//**************************************
			   B1_falselist = B_falselist;
			   B1_truelist = B_truelist;
			B1(B1_truelist, B1_falselist);
            //执行语义
			//{B.truelist = B1.tlist;
			// B.falselist = B1.flist;
			//*****************************
			  B_truelist = B1_tlist;
			  B_falselist = B1_flist;
			//*****************************
			break;
		default:
            printf("Error!\n");
			break;
	}

}

void B1(int B1_truelist, int B1_falselist)
{
	int N_quad, P_quad, B11_truelist, B11_falselist;

	if(currword == 18)
	{
	    fscanf(p, "%d %d", &currword, &entry); 
		N_quad = N();
		 B();
		 //执行语义动作
		 //{backpatch(B1.truelist, N.quad);
		 // B11.truelist = B.truelist;
		 // B11.falselist = merge(B1.falselist, B.falselist);}
		 //*****************************
		   backpatch(B1_truelist, N_quad);
           B11_truelist = B_truelist;
		   B11_falselist = merge(B1_falselist, B_falselist);
		 //*****************************
		 B1(B11_truelist, B11_falselist);
	}
	else if(currword == 19)
	{
	     fscanf(p, "%d %d", &currword, &entry);
		 P_quad = P();
         B();
         //执行语义动作
		 //{backpatch(B1.truelist, N.quad);
		 // B11.truelist = B.truelist;
		 // B11.falselist = merge(B1.falselist, B.falselist);}
		 //*****************************
		   backpatch(B1_falselist, P_quad);
           B11_falselist = B_falselist;
		   B11_truelist = merge(B1_truelist, B_truelist);
		 //*****************************
		 B1(B11_truelist, B11_falselist);
	}
	else if(currword != 29 && currword != 5 && currword != 3 && currword != 6 && currword != 26 && currword != 27 && currword != 12) //这里需要求follow(B),follow(E)
	{
	     printf("Error! Maybe something lost: )? then? do? else? +? *? &? }? |?\n");
	}
	else
	{
	     //执行语义动作
		 //{B1.tlist = B1.truelist;
		 // B1.flist = B1.falselist;
		 //***************************
		   B1_tlist = B1_truelist;
		   B1_flist = B1_falselist;
		 //****************************
	}
}

void relop(char* idname)
{
	switch(currword)
	{
	   case 20:
		   //执行语义动作
		   //{ relop_op = "j<";
		   //  relop_id = idname;
		   //****************************
		     strcpy(relop_op, "j<");
			 strcpy(relop_id, idname);
		   //****************************
		   fscanf(p, "%d %d", &currword, &entry);
		   break;
	   case 22:
		   //执行语义动作
		   //{ relop_op = "j<=";
		   //  relop_id = idname;
		   //****************************
		     strcpy(relop_op, "j<=");
			 strcpy(relop_id, idname);
		   //****************************
		   fscanf(p, "%d %d", &currword, &entry);
		   break;
	   case 23:
		   //执行语义动作
		   //{ relop_op = "j>=";
		   //  relop_id = idname;
		   //****************************
		     strcpy(relop_op, "j>=");
			 strcpy(relop_id, idname);
		   //****************************
		   fscanf(p, "%d %d", &currword, &entry);
		   break;
	   case 24:
		   //执行语义动作
		   //{ relop_op = "j<>";
		   //  relop_id = idname;
		   //****************************
		     strcpy(relop_op, "j<>");
			 strcpy(relop_id, idname);
		   //****************************
		   fscanf(p, "%d %d", &currword, &entry);
		   break;
	   default:
		   printf("Error! Some relation signal lost\n");
	       break;
	}
}

int N()
{
    int N_quad;
	//执行语义动作
	//{N.quad = nextquad;}
	//*********************
	  N_quad = sencount;
	//*********************
	return N_quad;
}

int P()
{
    int P_quad;
	//执行语义动作
	//{P.quad = nextquad;}
	//*********************
	  P_quad = sencount;
	//*********************   
	return P_quad;
}


void E(int entrance)
{
	char E1_place[4];

	switch(currword)
	{
	    case 28:
			fscanf(p, "%d %d", &currword, &entry);
			E(entry);
			if(currword == 29)
			{ 
			    //执行语义E1.place = E.place
				//***************************
				  strcpy(E1_place, E_place);
				//***************************
				fscanf(p, "%d %d", &currword, &entry);
				E1(E1_place);
				//执行语义动作E.place = E1.p
			    //*************
                  strcpy(E_place, E1_p);
			    //*************
			}
			else
				printf("Error! “)” lost\n");
			break;
		case 11:
			//执行语义动作E1.place = id.place
			//***************************************
			  strcpy(E1_place, ST.SB[entrance].idname);
			//***************************************
			fscanf(p, "%d %d", &currword, &entry);
			E1(E1_place);
			//执行语义动作E.place = E1.p
			//*************
              strcpy(E_place, E1_p);
			//*************
			break;
		case 10:
			//执行语义动作E1.place = const.val
			//***************************************
			  strcpy(E1_place, DT.digitlist[entrance]);
			//***************************************
			fscanf(p, "%d %d", &currword, &entry);
			E1(E1_place);
			//执行语义动作E.place = E1.p
			//*************
              strcpy(E_place, E1_p);
			//*************
			break;
		default:
			printf("Error!\n");
			break;
	}
}

void E1(char* E1_place)
{
     char E1_place1[4]; 
	
     if(currword == 26)
	 {
	     fscanf(p, "%d %d", &currword, &entry);
		 E(entry);
		 //执行语义动作
		 //**************************
		  strcpy(E1_place1, newtemp[varicount++]);
           write("+", E_place, E1_place, E1_place1);
		 //**************************
		 E1(E1_place1);
	 }
	 else if(currword == 27)
	 {
	     fscanf(p, "%d %d", &currword, &entry);
		 E(entry);
		 //执行语义动作
		 //**************************
		   strcpy(E1_place1, newtemp[varicount++]);          //这个地方有待考虑
           write("*", E_place, E1_place, E1_place1);
		 //**************************
		 E1(E1_place1);
	 }
	 else if(currword != 6 && currword != 29 && currword != 14 && currword != 3 && currword != 13 && currword != 5 && currword != 18 && currword != 19)
		 printf("Error! Maybe something lost: +? *? )? else? }? do? then? |? &?\n");
	 else
	 {
		 //执行语义动作E1.p = R1.place
		 //***********************
		   strcpy(E1_p, E1_place);
		 //***********************
	 }
}

void InitStack()
{
    DS.top = 0;
}

void Pop()
{
    --DS.top;
}

void Push(int entry)
{ 
    DS.entry[DS.top] = entry;
	++DS.top;
}

void ReaddigTable()
{
    int seqnum;
	int i = 1;
	fscanf(r, "%d %s", &seqnum, DT.digitlist[0]);
	while(seqnum != END)
	{
	    fscanf(r, "%d %s", &seqnum, DT.digitlist[i]);
		++i;
	}
	DT.quantity = i - 1;
}

void ReadidTable()
{
    int seqnum;
	int i = 1;
	fscanf(q, "%d %s", &seqnum, ST.SB[0].idname);
	strcpy(ST.SB[0].type, "$");
	while(seqnum != END)
	{
	   fscanf(q, "%d %s", &seqnum, ST.SB[i].idname);
	   strcpy(ST.SB[0].type, "$");    //将所有类型初始化为$
	   ++i;
	}
    ST.quantity = i - 1;
}

//函数功能:将属性填入符号表中
void FillTable(char* type, int i)
{
    strcpy(ST.SB[DS.entry[i]].type, type);
}

void write(char* op, char* argu1, char* argu2, char* result)
{
    strcpy(sen[sencount].op, op);
	strcpy(sen[sencount].argu1, argu1);
	strcpy(sen[sencount].argu2, argu2);
	strcpy(sen[sencount].result, result);
	if(sen[sencount].op[0] == 'j')   //jmp指令要特殊处理
	{
		sen[sencount].jmpforth = 0;         //相当于jmp四元式的第四个域
	    sen[sencount].flag = 1;
	}
	else
		sen[sencount].flag = 0;
		++sencount;
}

void backpatch(int head, int quad)
{
    int q = head, temp,m;
    while(q)    //未到链表末尾
	{
	    temp = sen[q].jmpforth;
		sen[q].jmpforth = quad;
		m=sencount;
		q = temp;
	}
}

int merge(int list1, int list2)
{
   int p, head;
   if(list2 == 0)
       head = list1;
   else
   { 
       p = list2;
	   while(sen[p].jmpforth)
	       p = sen[p].jmpforth;
	   sen[p].jmpforth = list1;
	   head = list2;
   }
   return head;
}

⌨️ 快捷键说明

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