📄 macrobodydef_c.cpp
字号:
//---------------------------------------------------------------------------
//-------- MacroBodyDef_C.cpp -----------------------------------------------
//---------------------------------------------------------------------------
#include "JsGlobal_H.h"
#include "MacroBodyDef_H.h"
#include "MAsmber_H.h"
//---------------------------------------------------------------------------
// 宏定义,宏处理
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// MacroDefBody
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 对其中出现的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进化!
ft->ExpPt = fer; // 其指针域指向相应的形参。
} // endif
else // fer == NULL
{ fer = SearchLocalArg(ft->Name);
if(fer) // Have found Local Argu.
{ ft->Token = LocalArgv; // Token进化!
ft->ExpPt = fer; // 其指针域指向相应的局参。
} // 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
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 设置宏头和宏尾。
// 扫描宏体,识别其中的形参和局参,改成FormalArgv和LocalArgv。
// CLine带值返回,返回时指向ENDM。
//---------------------------------------------------------------------------
void MacroDefBody::MroBodyScanAndRecg(AsmLine* &CLine)
{ MacroBegin = CLine; // 得到宏体头
for( ; CLine != NULL
&& CLine->HeadToken() != ENDMTkn; // 注意,用头结点作判别!
CLine = CLine->next )
{ // 对其中出现的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
//---------------------------------------------------------------------------
//----- 析构器 --------------------------------------------------------------
MacroRegList::~MacroRegList()
{ for( register MacroDefBody* temp = head;
head;
head = head->next,
delete temp,
temp = head ); // end for
} // end destructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 从宏定义表的表头开始,搜索指定的宏名的宏定义。
// 找不到返回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
//---------------------------------------------------------------------------
//------ 析构器 -------------------------------------------------------------
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
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 从表中搜索指定名字的变量, 返回指向该结点的指针。找不到,返回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
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 计算数值表达式的值。
// err带值返回。返回的值可以直接OutputErr。
//---------------------------------------------------------------------------
#define getOpKn OpKn = ( Pt ? Pt->Token : ' ' );
#define getNextOp Pt = Pt->next; getOpKn
//---------------------------------------------------------------------------
int32 MacroVarList::CalVarExpr(ERR &err, Tokenfield* Pt)
{ err = 0; // 对err清零
TokenStack optr; ValueStack opnd;
int16u OpKn; getOpKn;
while( OpKn !=' ' || optr.Notempty() )
{ if( IsOPTR(OpKn) ) // 是个运算符
{ // 已经得到一个运算符.
switch( OPsuperior( optr.gettop(), OpKn ) )
{ case '<' : { optr.push(OpKn); // 运算符入栈
getNextOp; break;
} // end case
case '=' : { optr.pop(); // 运算符出栈
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 // 不是运算符, 而是操作数, 则进栈
{ 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. 得到结果。
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; }
//---------------------------------------------------------------------------
// 计算数值表达式。返回的err值可以用OutputErr打印出来。
//---------------------------------------------------------------------------
ERR MacroVarList::OPTRAct(TokenStack &optr, ValueStack &opnd)
{ switch(optr.pop())
{ // 双目运算
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
// 单目运算
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.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -