📄 pass2.cpp
字号:
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 + -