📄 macrobodydef_h.h
字号:
//---------------------------------------------------------------------------
//-------- MacroBodyDef_H.h -------------------------------------------------
//---------------------------------------------------------------------------
#ifndef MacroBodyDef_H.h // 防止被重复引用
#define MacroBodyDef_H.h
//---------------------------------------------------------------------------
#include "Jstring_H.h"
#include "AsmL_H.h"
#include "Tokenfield_H.h"
#include "TokenOper_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// 宏定义体
//
//---------------------------------------------------------------------------
class MacroDefBody : public JObject
{ private:
Jstring MacroName; // 宏名。
AsmLine* MacroBegin; // 指向宏体语句,不包括MACRO, LOCAL。
AsmLine* MacroEnd; // 指向相应的ENDM。
Tokenfield* arguPtr; // 指向宏体的形式参数。
Tokenfield* localPtr; // 指向宏中的局部参数。
MacroDefBody* next; // 指向下一个结点。
// ------- private functions ----------
public:
MacroDefBody(const Jstring& Mname); // constructor
~MacroDefBody() {} // destructor
// ------- public functions -----------
// 宏体是否为空。
bool IsBodyEmpty()const
{ return (MacroBegin == MacroEnd); } // end IsBodyEmpty
// 寻找形参。判别输入的名字是否为一个形参的名字。
Tokenfield* SearchFormArgv(const Jstring& fname)const;
// 寻找局参。判别输入的名字是否为一个局参的名字。
Tokenfield* SearchLocalArg(const Jstring& fname)const;
// 对其中出现的WordSToken作判别,如果是形参,改成FormalArgv。
// 如果是局参,改成LocalArgv。
// 把CharDatan, LongCharn, StrDataKn这些Token都改成WordSToken。
// CLine不能是空行。
void SearchAndRecgArgvInMro(AsmLine* CLine);
// 设置宏头和宏尾。
// 扫描宏体,识别其中的形参和局参,改成FormalArgv和LocalArgv。
// CLine带值返回,返回时指向ENDM。
void MroBodyScanAndRecg(AsmLine* &CLine);
// ---------------------------
void show()const;
void showArgu()const;
// ---------------------------
friend class MacroRegList;
friend class MacrosManager;
}; // end MacroDefBody
//---------------------------------------------------------------------------
//----- 构造器 --------------------------------------------------------------
inline MacroDefBody::MacroDefBody(const Jstring& Mname)
:MacroBegin(NULL),MacroEnd(NULL),
arguPtr(NULL),localPtr(NULL),
next(NULL)
{ MacroName = Mname;
} // end constructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 寻找形参。
//---------------------------------------------------------------------------
inline Tokenfield* MacroDefBody::SearchFormArgv(const Jstring& fname)const
{ return TokenOper::SearchToken(arguPtr, fname);
} // end SearchFormArgv
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 寻找局参。
//---------------------------------------------------------------------------
inline Tokenfield* MacroDefBody::SearchLocalArg(const Jstring& fname)const
{ return TokenOper::SearchToken(localPtr, fname);
} // end SearchLocalArg
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// 宏定义表
//
//---------------------------------------------------------------------------
class MacroRegList : public JObject
{ private:
MacroDefBody* head; // 链头。
public:
MacroRegList():head(NULL) {} // constructor
~MacroRegList(); // destructor
// ------ public functions ---------
// 从表头插入新变量。
void InsertMacro(MacroDefBody* mbody);
// 根据宏名找宏定义,找到就返回指向宏定义体的指针。找不到,返回NULL。
MacroDefBody* SearchMacro(const Jstring& vname);
// -------------------------
friend class MacrosManager;
}; // end MacroRegList
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 从表头插入节点。
//---------------------------------------------------------------------------
inline void MacroRegList::InsertMacro(MacroDefBody* mbody)
{ mbody->next = head;
head = mbody;
} // end InsertMacro
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// 宏变量结点
//
//---------------------------------------------------------------------------
class MacroVarNode
{ private:
Jstring name; // 变量名
int16u value; // 变量值
MacroVarNode* next; // 指针
public:
// ------- constructor ---------
// -------- 构造器1 ----------- // 注意value和next没有赋初始值。
MacroVarNode(const Jstring& na) { name = na; } // end constructor
// -------- 构造器2 -----------
MacroVarNode(const Jstring& na, int16u val):next(NULL)
{ name = na; value = val; } // end constructor
// -----------------------------
friend class MacroVarList;
}; // end MacroVarNode
//---------------------------------------------------------------------------
#include "TriVal_H.h"
//---------------------------------------------------------------------------
//
// 宏变量表
//
//---------------------------------------------------------------------------
class MacroVarList
{ private:
MacroVarNode* head; // 链头。
// ------ private functions -------
// 从表中搜索指定名字的变量, 返回指向该结点的指针。找不到,返回NULL。
MacroVarNode* SearchVar(const Jstring& vname);
public:
MacroVarList():head(NULL) {} // constructor
~MacroVarList(); // destructor
// ------ public functions -------
// 计算数值表达式的值。
int32 CalVarExpr(ERR &err, Tokenfield* Pt);
// 对操作数进行相应的运算。
ERR OPTRAct(TokenStack &optr, ValueStack &opnd);
// 从表头插入新变量。
void InsertVar(const Jstring& vname, int16u val);
// 更新或新建变量。
void UpdateVar(const Jstring& vname, int16u val);
// 从表中搜索变量的值。
MacroVarNode* GetValue(const Jstring& vname, int16u &val);
// -------------------------
void show()const;
// -------------------------
friend class MacrosManager;
}; // end MacroVarList
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 从表头插入新变量。
//---------------------------------------------------------------------------
inline void MacroVarList::InsertVar(const Jstring& vname, int16u val)
{ MacroVarNode* vp = new MacroVarNode(vname);
vp->value = val;
vp->next = head;
head = vp;
} // end InsertVar
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 更新或新建变量。
//---------------------------------------------------------------------------
inline void MacroVarList::UpdateVar(const Jstring& vname, int16u val)
{ MacroVarNode* mt = SearchVar(vname);
if( mt ) // Found.
{ mt->value = val; } // endif
else // Not found. (mt==NULL)
{ InsertVar(vname, val); } // end else
} // end UpdateVar
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 已知变量的名称,从表中搜索变量的值。
// 找到, 返回值为指向该节点的指针,val带值返回。找不到返回NULL。
//---------------------------------------------------------------------------
inline MacroVarNode* MacroVarList::GetValue(const Jstring& vname, int16u &val)
{ MacroVarNode* mt = SearchVar(vname);
if(mt) { val = mt->value; } // endif
return mt;
} // end GetValue
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -