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

📄 pass2.cpp

📁 虚拟机设计与实现——C/C++
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end IDR*/

/*-----------------------------------------------------------------*/

void Pass2::ID(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 2;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end ID*/

/*-----------------------------------------------------------------*/

void Pass2::I2D(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end I2D*/


/*-----------------------------------------------------------------*/

void Pass2::I3D(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 4;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }
	
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[3]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end I3D*/

/*-----------------------------------------------------------------*/

void Pass2::IRD(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end IRD*/

/*-----------------------------------------------------------------*/

void Pass2::IFD(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end IFD*/

/*-----------------------------------------------------------------*/

void Pass2::commitToFiles(U1 len)
{
	U4 i;

	/*populate list file*/

	if((*cmdLine).listing==TRUE)
	{
		/*line number*/

		putStrLstBuff(lineNumber);
		putByteLstBuff(')');

		/*address*/
		putByteLstBuff('[');
		sprintf(lineNumber,"%lu",bytePosPass2);
		putStrLstBuff(lineNumber);
		putByteLstBuff(']');

		/*instruction*/

		putByteLstBuff('\t'); 
		putByteLstBuff('\t'); 
		putStrLstBuff(listing);						
		i = strlen(listing);
		while(i<=30){ putByteLstBuff(' '); i++; }

		/*binary version*/

		putByteLstBuff('\t');
		for(i=0;i<len;i++)
		{
			putByteLstBuff('[');
			sprintf(lineNumber,"%lu",encoded[i]);
			putStrLstBuff(lineNumber);
			putByteLstBuff(']');
		}
		putByteLstBuff('\n');	
	}

	/*populate temp file*/

	for(i=0;i<len;i++){ putByteTempBuff(encoded[i]); }

	return;

}/*end commitToFiles*/

/*-----------------------------------------------------------------*/

void Pass2::generateSymbolSummary()
{
	U4 i;
	U8 nstr;

	/* 1) print out symbol table to listing file*/

	putByteLstBuff('\n');
	sprintf(listing,"%s","#++++SYMBOL TABLE++++++");
	putStrLstBuff(listing);
	putByteLstBuff('\n');

	for(i=0;i<(*symTbl).iGlobVar;i++)
	{
		sprintf(listing,"->GLOBAL VARIABLE %d)",i); 
		putStrLstBuff(listing);
		printGlobVarToLst(&((*symTbl).globVar[i]));
		putByteLstBuff('\n');
	}
	for(i=0;i<(*symTbl).iProc;i++)
	{
		sprintf(listing,"->PROCEDURE %d)",i);
		putStrLstBuff(listing);
		printProcToLst(&((*symTbl).proc[i]));
		putByteLstBuff('\n');
	}

	/* 2) print out hash table to listing file*/

	putByteLstBuff('\n');
	sprintf(listing,"%s","#++++HASH TABLE++++++");
	putStrLstBuff(listing);
	putByteLstBuff('\n');

	for(i=0;i<PRIME;i++)
	{ 
		if((*hashTbl).hashTbl[i].empty == FALSE)
		{
			sprintf(listing,"Hash Slot %d)\n",i);
			putStrLstBuff(listing);

			printTreeToLst(&((*hashTbl).hashTbl[i]), 0);
			putByteLstBuff('\n');
		}
	}

	/* 3) print out string table to listing file*/

	putByteLstBuff('\n');
	sprintf(listing,"%s","#++++STRING TABLE++++++");
	putStrLstBuff(listing);
	putByteLstBuff('\n');

	nstr = 1;

	for(i=0;i<(*strTbl).iStr;i++)
	{
		if(i==0)
		{
			putByteLstBuff('0');
			putByteLstBuff(')');
		}
		if((*strTbl).text[i]!='\0')
		{ 
			putByteLstBuff((*strTbl).text[i]); 
		}
		else if(i<((*strTbl).iStr-1))
		{ 
			putByteLstBuff('\n');
			sprintf(lineNumber,"%d)",nstr); 
			putStrLstBuff(lineNumber);
			nstr++; 
		}
		else if(i==((*strTbl).iStr-1)){ putByteLstBuff('\n');}
	}

	return;

}/*end generateSymbolSummary*/

/*-----------------------------------------------------------------*/

void Pass2::printGlobVarToLst(struct GlobalVariable *ptr)
{	
	sprintf(listing,"identifier=%s\n",&((*strTbl).text[(*ptr).text]));
	putStrLstBuff(listing);

	sprintf(listing,"data type=%s\n",globSz[(*ptr).dType]);
	putStrLstBuff(listing);

	sprintf(listing,"array length=%lu\n",(*ptr).len);
	putStrLstBuff(listing);

	sprintf(listing,"total size=%lu\n",(*ptr).size);
	putStrLstBuff(listing);

	sprintf(listing,"line=%lu\n",(*ptr).line);
	putStrLstBuff(listing);

	sprintf(listing,"offset_$TOP=%lu\n",(*ptr).offset);
	putStrLstBuff(listing);

	return;

}/*end printGlobVarToLst*/ 

/*-----------------------------------------------------------------*/

void Pass2::printProcToLst(struct Procedure *ptr)
{
	U2 i;

	sprintf(listing,"identifier=%s\n",&((*strTbl).text[(*ptr).text]));
	putStrLstBuff(listing);


	sprintf(listing,"address=%lu\n",(*ptr).address);
	putStrLstBuff(listing);

	sprintf(listing,"source file line=%lu\n",(*ptr).line);
	putStrLstBuff(listing);

	if((*ptr).nRet)
	{
		
		sprintf(listing,"RET\n");
		putStrLstBuff(listing);
		
		putByteLstBuff('\t');
		sprintf(listing,"identifier=%s\n",&((*strTbl).text[((*ptr).ret).text]));
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"fpOffset=%d\n",((*ptr).ret).fpOffset);
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"line=%lu\n",((*ptr).ret).line);
		putStrLstBuff(listing);

	}

	sprintf(listing,"ARGS\n");
	putStrLstBuff(listing);

	for(i=0;i<(*ptr).iArg;i++)
	{
		sprintf(listing,"%d)",i);
		putStrLstBuff(listing);

		sprintf(listing," identifier=%s\n",&((*strTbl).text[((*ptr).arg[i]).text]));
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"fpOffset=%d\n",((*ptr).arg[i]).fpOffset);
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"line=%lu\n",((*ptr).arg[i]).line);
		putStrLstBuff(listing);

	}
	sprintf(listing,"LOCALS\n");
	putStrLstBuff(listing);
	for(i=0;i<(*ptr).iLocal;i++)
	{
		sprintf(listing,"%d)",i);
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing," identifier=%s\n",&((*strTbl).text[((*ptr).local[i]).text]));
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"fpOffset=%d\n",((*ptr).local[i]).fpOffset);
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"line=%lu\n",((*ptr).local[i]).line);
		putStrLstBuff(listing);

	}
	sprintf(listing,"LABELS\n");
	putStrLstBuff(listing);
	for(i=0;i<(*ptr).iLabel;i++)
	{
		sprintf(listing,"%d)",i);
		putStrLstBuff(listing);

		sprintf(listing," identifier=%s\n",&((*strTbl).text[((*ptr).label[i]).text]));
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"address=%lu\n",((*ptr).label[i]).address);
		putStrLstBuff(listing);

		putByteLstBuff('\t');
		sprintf(listing,"line=%lu\n",((*ptr).label[i]).line);
		putStrLstBuff(listing);

	}
	return;

}/*end printProcToLst*/

/*-----------------------------------------------------------------*/

void Pass2::printTreeToLst(struct HashTbl* link, int level)
{
	int i;
	int size;

    if(link==NULL)
    {
        return;
    }
    
	printTreeToLst((*link).left,level+1);
    for(i=0;i<level;i++){ putByteLstBuff('-'); }

    sprintf(listing,"id =%s",&((*strTbl).text[(*link).text]));
	size = strlen(listing);
	for(i=0;i<size;i++){ putByteLstBuff(listing[i]);}
	while(i<20){ i++; putByteLstBuff(' '); }

	sprintf(listing," type=%s",SymTypeStr[(*link).type]);
	size = strlen(listing);
	for(i=0;i<size;i++){ putByteLstBuff(listing[i]);}
	while(i<20){ i++; putByteLstBuff(' '); }

	sprintf(listing,"(i,si)=(%d,%d)\n",(*link).index,(*link).subIndex);
	putStrLstBuff(listing);

    printTreeToLst((*link).right,level+1);
	return;

}/*end printTreeToLst*/

⌨️ 快捷键说明

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