?? macrobodydef_c.cpp
字號(hào):
//---------------------------------------------------------------------------
//-------- MacroBodyDef_C.cpp -----------------------------------------------
//---------------------------------------------------------------------------
#include "JsGlobal_H.h"
#include "MacroBodyDef_H.h"
#include "MAsmber_H.h"
//---------------------------------------------------------------------------
// 宏定義,宏處理
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// MacroDefBody
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 對(duì)其中出現(xiàn)的WordSToken作判別,如果是形參,改成FormalArgv。
// 如果是局參,改成LocalArgv。
// 把CharDatan, LongCharn, StrDataKn這些Token都改成WordSToken。
// CLine不能是空行。
//---------------------------------------------------------------------------
void MacroDefBody::SearchAndRecgArgvInMro(AsmLine* CLine)
{ for( Tokenfield* ft = CLine->FirstTkn();
ft;
ft = ft->next )
{ switch(ft->Token)
{ case WordSToken:
{ register Tokenfield* fer = SearchFormArgv(ft->Name);
if(fer) // Have found out that it is a Formal argv
{ ft->Token = FormalArgv; // Token進(jìn)化!
ft->ExpPt = fer; // 其指針域指向相應(yīng)的形參。
} // endif
else // fer == NULL
{ fer = SearchLocalArg(ft->Name);
if(fer) // Have found Local Argu.
{ ft->Token = LocalArgv; // Token進(jìn)化!
ft->ExpPt = fer; // 其指針域指向相應(yīng)的局參。
} // endif
// no else
} // end else
break;
} // end case
case CharDatan: case LongCharn: case StrDataKn:
{ ft->Token = WordSToken; // 在宏中,這些Token被看成WordSToken一樣。
break;
} // end case
// no default...
} // end switch
} // end for
} // end SearchAndRecgArgvInMro
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 設(shè)置宏頭和宏尾。
// 掃描宏體,識(shí)別其中的形參和局參,改成FormalArgv和LocalArgv。
// CLine帶值返回,返回時(shí)指向ENDM。
//---------------------------------------------------------------------------
void MacroDefBody::MroBodyScanAndRecg(AsmLine* &CLine)
{ MacroBegin = CLine; // 得到宏體頭
for( ; CLine != NULL
&& CLine->HeadToken() != ENDMTkn; // 注意,用頭結(jié)點(diǎn)作判別!
CLine = CLine->next )
{ // 對(duì)其中出現(xiàn)的WordSToken作判別,如果是形參,改成FormalArgv;
SearchAndRecgArgvInMro(CLine); // 如果是局參,改成LocalArgv。
} // end for
// 宏體尾
MacroEnd = CLine; // 得到宏體尾
CLine->Enable = false; // 最后把CLine禁用。(ENDM)
} // end MroBodyScanAndRecg
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void MacroDefBody::show()const
{ printf("\nMacroBody [%s]", (const char*)MacroName);
printf("\nMacro begin at Line[%d]", MacroBegin ? MacroBegin->GetLineNo():0);
printf("\nMacro end at Line[%d]", MacroEnd ? MacroEnd->GetLineNo():0);
printf("\nArgu pointing: ");
if(arguPtr) { arguPtr->show(); } // endif
else { printf("NULL"); } // end else
printf("\nlocal pointing: ");
if(localPtr) { localPtr->show(); } // endif
else { printf("NULL"); } // end else
} // end show
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void MacroDefBody::showArgu()const
{ printf("\n---- Argu show: ----");
for( register Tokenfield* pt = arguPtr;
pt;
pt = pt->next )
{ printf("\nArgu[%s]=[%s]", (const char*)pt->Name,
pt->ExpPt ? (const char*)pt->ExpPt->Name : "nil");
} // end for
for( register Tokenfield* pt = localPtr;
pt;
pt = pt->next )
{ printf("\nLocal[%s]=[??%4.4X]",(const char*)pt->Name, pt->Value); } // end for
} // end showArgu
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// MacroRegList
//---------------------------------------------------------------------------
//----- 析構(gòu)器 --------------------------------------------------------------
MacroRegList::~MacroRegList()
{ for( register MacroDefBody* temp = head;
head;
head = head->next,
delete temp,
temp = head ); // end for
} // end destructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 從宏定義表的表頭開(kāi)始,搜索指定的宏名的宏定義。
// 找不到返回NULL。
//---------------------------------------------------------------------------
MacroDefBody* MacroRegList::SearchMacro(const Jstring& vname)
{ register MacroDefBody* mbt;
for( mbt = head;
mbt && mbt->MacroName != vname;
mbt = mbt->next ); // end for
return mbt;
} // end SearchMacro
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// MacroVarList
//---------------------------------------------------------------------------
//------ 析構(gòu)器 -------------------------------------------------------------
MacroVarList::~MacroVarList()
{ for( register MacroVarNode* temp = head;
head;
head = head->next,
delete temp,
temp = head ); // end for
} // end destructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void MacroVarList::show()const
{ printf("\n===== [MacroVarList] =====");
for( register MacroVarNode* temp = head;
temp;
temp = temp->next )
{ printf("\n[%s]=%XH, %u",(const char*)temp->name, temp->value, temp->value);
} // end for
printf("\n===== [List end] =====");
} // end show
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 從表中搜索指定名字的變量, 返回指向該結(jié)點(diǎn)的指針。找不到,返回NULL。
//---------------------------------------------------------------------------
MacroVarNode* MacroVarList::SearchVar(const Jstring& vname)
{ register MacroVarNode* mt;
for( mt = head;
mt && vname != mt->name;
mt = mt->next ); // end for
return mt;
} // end SearchVar
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 計(jì)算數(shù)值表達(dá)式的值。
// err帶值返回。返回的值可以直接OutputErr。
//---------------------------------------------------------------------------
#define getOpKn OpKn = ( Pt ? Pt->Token : ' ' );
#define getNextOp Pt = Pt->next; getOpKn
//---------------------------------------------------------------------------
int32 MacroVarList::CalVarExpr(ERR &err, Tokenfield* Pt)
{ err = 0; // 對(duì)err清零
TokenStack optr; ValueStack opnd;
int16u OpKn; getOpKn;
while( OpKn !=' ' || optr.Notempty() )
{ if( IsOPTR(OpKn) ) // 是個(gè)運(yùn)算符
{ // 已經(jīng)得到一個(gè)運(yùn)算符.
switch( OPsuperior( optr.gettop(), OpKn ) )
{ case '<' : { optr.push(OpKn); // 運(yùn)算符入棧
getNextOp; break;
} // end case
case '=' : { optr.pop(); // 運(yùn)算符出棧
getNextOp; break;
} // end case
case '>' : { err = OPTRAct(optr, opnd); // 給err賦值
if(err) { EThrows(printf("\tOpAct Result err!");); return NULL; } // endif
break;
} // end case
default : { FatalErr("\nCalVarExpr out of run!"); } // end default
} // end switch
} // endif IsOPTR(Token)
else // 不是運(yùn)算符, 而是操作數(shù), 則進(jìn)棧
{ switch(Pt->Token)
{ case ValueToken: { break; } // end case
case WordSToken: { MacroVarNode* pn = SearchVar(Pt->Name);
if(pn == NULL) { err = LabelUnDefErr; return NULL; } // endif
Pt->Value = pn->value; // 取變量的值
break; } // end case
default : { err = ExpSyrErr; return NULL; } // end default
} // end switch
opnd.push(Pt->Value); // 入棧
getNextOp;
} // end else
} // end while
int32 val = opnd.pop(); // No error. 得到結(jié)果。
Assert( if( Pt || !optr.empty() || !opnd.empty() ) // Just for Debug!!
{ FatalErr("\nError in OPstack!!"); } // endif
);
return val;
} // end CalVarExpr
//---------------------------------------------------------------------------
#undef getOpKn
#undef getNextOp
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define pop2opnd \
int32 b = opnd.pop(); \
int32 a = opnd.pop();
//---------------------------------------------------------------------------
#define pop1opnd \
int32 a = opnd.pop();
//---------------------------------------------------------------------------
#define IFDIVerZero if(b == 0) { return DividerIsZeroErr; }
//---------------------------------------------------------------------------
// 計(jì)算數(shù)值表達(dá)式。返回的err值可以用OutputErr打印出來(lái)。
//---------------------------------------------------------------------------
ERR MacroVarList::OPTRAct(TokenStack &optr, ValueStack &opnd)
{ switch(optr.pop())
{ // 雙目運(yùn)算
case '+' : { pop2opnd; opnd.push(a + b); break; } // end case
case '-' : { pop2opnd; opnd.push(a - b); break; } // end case
case '*' : { pop2opnd; opnd.push(a * b); break; } // end case
case '/' : { pop2opnd; IFDIVerZero; opnd.push(a / b); break; } // end case
case '%' : { pop2opnd; IFDIVerZero; opnd.push(a % b); break; } // end case
case '.' : { return ComNotAllowErr; } // end case
case AND : { pop2opnd; opnd.push(a & b); break; } // end case
case OR : { pop2opnd; opnd.push(a | b); break; } // end case
case XOR : { pop2opnd; opnd.push(a ^ b); break; } // end case
case '=' : { pop2opnd; opnd.push(a == b);break; } // end case
case '<' : { pop2opnd; opnd.push(a < b); break; } // end case
case '>' : { pop2opnd; opnd.push(a > b); break; } // end case
case GRtEQUKen: { pop2opnd; opnd.push(a >= b); break; } // end case
case LessEQUKn: { pop2opnd; opnd.push(a <= b); break; } // end case
case NotEqual : { pop2opnd; opnd.push(a != b); break; } // end case
case SHL : { pop2opnd;
if(b > 16) { return ShiftOutRangeErr; } // endif
opnd.push(a << b); break;
} // end case
case SHR : { pop2opnd;
if(b > 16) { return ShiftOutRangeErr; } // endif
opnd.push(a >> b); break;
} // end case
// 單目運(yùn)算
case NOT : { pop1opnd; opnd.push(~a); break; } // end case
case HIGH: { pop1opnd; opnd.push((a & 0xff00)>>8); break; } // end case
case LOW: { pop1opnd; opnd.push(a & 0x00ff); break; } // end case
case SingleNeg : { pop1opnd; opnd.push(-a); break; } // end case
case SinglePlus: { break; } // end case
default : { return BadOPinExprErr; } // end default
} // end switch
return OK_no_Err;
} // end OPTRAct
//---------------------------------------------------------------------------
#undef pop2opnd
#undef pop1opnd
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// end MacroBodyDef_C.cpp
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -