📄 macromanager_h.h
字号:
//---------------------------------------------------------------------------
//-------- MacroManager_H.h -------------------------------------------------
//---------------------------------------------------------------------------
#ifndef MacroManager_H.h // 防止被重复引用
#define MacroManager_H.h
//---------------------------------------------------------------------------
#include "MacroBodyDef_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 宏定义识别和宏展开管理器
//---------------------------------------------------------------------------
class MacrosManager : public JObject
{ private:
MacroAsmber& masm; // 指向他的父亲
MacroRegList* MRList; // 指向宏定义体注册
int16u MacroCallCounter; // 防止过多的宏调用
// 局参号码分配计数器, 一个OBJ文件只能有一个。
static int16u LocalLabelIDnum;
public:
// -------- constructors ------------
MacrosManager(MacroAsmber& parent); // constructor
~MacrosManager(); // destructor
// --------- public functions ------------
// 分派局参号码
int16u AssaignLocalLabelNo()const { return LocalLabelIDnum++; }
// 局参名字的拼装:("??xxxx")
void LocalArgvToJstr(int16u val, Jstring &s);
// 宏定义注册。输入一个汇编行,该汇编行含有一个MacroDef和一些形参。
ERR MacroRegister(AsmLine* &CLine);
// 对MacroDef后的形参表进行分析。
ERR MacroDefParser(AsmLine* &CLine, MacroDefBody* Mbody);
// 对遇到的Word看看是否为宏,是则进行宏调用的语法分析。
bool IsMacroAndParse(ERR &err, Tokenfield* pt);
// 把宏定义体中的某一行拿出来,把其中的形参用实参替代。
ERR MacroLineBacktoJstr(AsmLine* Line, Jstring &s);
// 宏展开词法分析器。
ERR MacroToToken(const MacroDefBody* mbody,AsmLine* BaseLn,
AsmLine* InsLn,AsmLine* &CLn);
// 宏调用处理。处理宏替代。
ERR MacroCall(AsmLine* &Ln);
// REPT 宏重复处理。
ERR MacroREPTdo(AsmLine* &Ln);
// REPT 语法分析器。
int16u REPT_Parser(ERR &err, AsmLine* Ln);
// 寻找LOCAL,并进行语法分析。
ERR TryLocalParse(AsmLine* &Ln, Tokenfield* &LocalarguPt,
Tokenfield* PreNamesSetPt);
// IRP 的语法分析。
ERR IRP_Parse(AsmLine* line, Tokenfield* &FormArgv,
Tokenfield* &ParaArgv);
// IRPC 的语法分析。
ERR IRPC_Parse(AsmLine* line, Tokenfield* &FormArgv,
Tokenfield* &ParaArgv);
// 遇到IRP指令的宏展开。
ERR MacroIRP_do(AsmLine* &Ln);
// 遇到IRPC指令的宏展开。
ERR MacroIRPC_do(AsmLine* &Ln);
//---------------------------------------------------------------
// 从str中截取一个单词, 放入para->Name中。str带值返回。
static bool FetchAParaWord(Jstring &str, Tokenfield ¶);
// 从str中截取一个字母, 放入para->Name中。str带值返回。
static bool FetchAParaLetter(Jstring &str, Tokenfield ¶);
//---------------------------------------------------------------
friend class MacroAsmber;
}; // end MacrosManager
//---------------------------------------------------------------------------
//------ 构造器 -------------------------------------------------------------
inline MacrosManager::MacrosManager(MacroAsmber& parent)
: masm(parent),
MacroCallCounter(0)
{ MRList = new MacroRegList;
} // end constructor
//---------------------------------------------------------------------------
//------ 析构器 -------------------------------------------------------------
inline MacrosManager::~MacrosManager()
{ delete MRList;
} // end destructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
inline void MacrosManager::LocalArgvToJstr(int16u val, Jstring &s)
{ s = "??";
s = s + Int16uToStr( val );
} // end LocalArgvToJstr
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -