📄 masmber_h.h
字号:
//---------------------------------------------------------------------------
//-------- MAsmber_H.h ------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef MAsmber_H.h // 防止被重复引用
#define MAsmber_H.h
//---------------------------------------------------------------------------
#include "JsGlobal_H.h"
#include "AsmF_H.h"
#include "LabelManiger_H.h"
#include "InstSystem_H.h"
#include "TokenOper_H.h"
#include "MacroManager_H.h"
#include "ErrPrintFile_H.h"
#include "OBJfile_H.h"
#include "ListFile_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
const int8 MaxIncFnNest = 62; // INCLUDE文件最大嵌套层数。
const int8 MaxIfElseNest = 62; // IFELSE最大嵌套层数。
const int8 MaxMroIfNest = 62; // $IF,$ELSE最大嵌套层数。
//---------------------------------------------------------------------------
//
//
// 宏汇编器
//
//
//---------------------------------------------------------------------------
class MacroAsmber : public JObject
{ private:
int Margc; // 外部参变数个数
char** Margv; // 外部参数字串数组
union
{ struct
{ int8 MacroDefNest; // 宏定义嵌套, 在最外层的宏之外的汇编行, 为0。
int8 IncFnNest; // INCLUDE文件嵌套计数。为防溢出而设(0)。
int8 IfElseNest; // IF、ELSE等的嵌套计数。在最外层的IF, 为0。
int8 MroIfNest; // $IF、$ELSE等的嵌套计数。在最外层的$IF, 为0。
}; // end struct
int32u NestGroup; // 计数器组。
}; // end union
union
{ struct
{ bool Pass :1; // (true) 扫描标记
bool ObjFile :1; // (true)
bool LstFile :1; // (true)
bool SFR51 :1; // (true)
bool ErrPrint :1; // (false)
bool noCond :1; // (false)
bool Dismacro :1; // (false)
bool PureText :1; // (false) 汇编行中控制词法,控制范围在一行之内。
}; // end struct
int8u FlagGroup; // 标志群
}; // end union
union
{ struct
{ bool da_bn :1; bool db_bn :1; bool ep_bn :1; bool oj_bn :1;
bool pl_bn :1; bool pw_bn :1; bool pr_bn :1; bool sb_bn :1;
bool xr_bn :1; bool tt_bn :1; bool mo_bn :1; bool co_bn :1;
bool ma_bn :1; bool rb_bn :1;
} xBn;
int16u ConflictBn; // 冲突开关组(0)
}; // end union
class InstSystem* Instm; // 指令系统管理器
class LabelManager* LabMger; // 标号管理器
class MacrosManager* MacroMger; // 宏管理器
class MacroVarList* MvList; // 条件控制标号管理器
class AsmFile* AsmFn; // 当前汇编文件指针
class OBJfile* objFilePt; // 当前目标文件指针
class LISTFile* LstFilePt; // 当前列表文件指针
class AsmLine* Ln; // 当前汇编行指针
class OBJmodule* JModulePt; // 当前模块指针
class ASM_Segment* SegPt; // 当前段指针
ErrPrintFile EpFile; // 打印错误信息的文件
Jstring Pname; // 不带后缀名的文件名
IFeStack IfStack; // IF 栈。
IFeStack MroIfStack; // $IF 栈。
// -------- private functions -------------
// ----------- Lexer ---------------
// 把一行源文本经词法分析转化成汇编行对象。
ERR StrLexToAsmline(char* text, AsmLine* &Ln, bool &CommEn);
// 把一行源文本经词法分析转化成Token流。
ERR StrToToken(char* s, bool &CommentEnable);
// 对特别的Token作特殊处理。(左归器)
void ActToken(int16u tokn, const Jstring& word, int32u val);
// 从源文本中取得一个符号或符号串,返回它的Token码。
int16u GetSymWord(char* p, Jstring &word, char* &behind);
// 把一个word转化成Token。
ERR NumWordToToken(Jstring &word);
// ----------- Parser -----------------
// 保留字语法分析器。
ERR ResvInstParse(Tokenfield* pt);
// 伪代码语法分析器。
ERR PsdoWordParse(Tokenfield* pt);
// 机器指令Token转化机。
ERR OPsetInstDo(Tokenfield* pt);
// --------- Macro Parser -------------
// 汇编控制指令语法分析器。
ERR DogCtrlParse(AsmLine* &line);
// 首要汇编控制指令语法分析器。
ERR MajorCtrlParse(AsmLine* &line);
// 从字串里取得数串并转换为数值。
ERR FetchVal(int32u &val, Jstring &str);
// RegisterBank设置。
ERR RegBank_Do(Jstring &str);
// 汇编日期设置。
ERR Date_Do(Jstring &str);
// INCLUDE命令功能模块。
ERR MC_Include(const Jstring& filename);
// 遇到EXITM指令的动作。
ERR MacroEXITM_Do(AsmLine* &Ln);
// --------- Macro -------------
void Case_Include_Do(ERR &err, AsmLine* &line, Tokenfield* &p);
void Case_Reset_Do(ERR &err, Tokenfield* pt);
void Case_Set_Do(ERR &err, Tokenfield* pt);
// ---------- 条件汇编 ----------------
// IF 语句表达式语法分析。
ERR MroIF_NeedOneExpr(Tokenfield* pt);
//
void Case_MroIF_Do(ERR &err, Tokenfield* pt);
void Case_MroENDIF_Do(ERR &err, Tokenfield* pt);
void Case_MroELSE_Do(ERR &err, Tokenfield* pt);
void Case_MroELSEIF_Do(ERR &err, Tokenfield* pt);
// -------------- 内部函数 --------------------
// IfElseNest计算器加一。
void IfElseNest_inc(ERR &err);
// IfElseNest计算器减一。
void IfElseNest_dec(ERR &err);
// 第二遍扫描时,跟踪当前段,当前所属段更新。
ERR Pass2UpdateCurSeg(Tokenfield* pt, int16u &value);
// --------- 语义分析内部函数 ------------------
ERR AddLabelThenDis(Tokenfield* pt, int8u typ, bool var);
ERR AddExtLabelThenDel(Tokenfield* tt);
ERR SetVarLabel(Tokenfield* pt, int8u typ, bool var);
ERR PWordMeaningAct(Tokenfield* pt);
ERR TknIsORGDo(Tokenfield* pt);
ERR ReservInstDo(Tokenfield* pt);
ERR TknIsLabelDefknDo(Tokenfield* pt);
ERR TknIsDSDoSth(Tokenfield* pt);
ERR TknIsDBITDoSth(Tokenfield* pt);
ERR TknIsRSEG_Do(Tokenfield* pt);
ERR TknIsCSEG_Do(Tokenfield* pt);
ERR TknIsDSEG_Do(Tokenfield* pt);
ERR TknIsXSEG_Do(Tokenfield* pt);
ERR TknIsISEG_Do(Tokenfield* pt);
ERR TknIsBSEG_Do(Tokenfield* pt);
ERR TknIsUsing_Do(Tokenfield* pt);
ERR Tkn_IF_Do(Tokenfield* pt);
ERR Tkn_ELSEIF_Do(Tokenfield* pt);
void PublicKn_do(ERR &err, Tokenfield* pt);
// 宏展开到新汇编行对象。
AsmLine* TokenNameToNewLn(ERR &err, Tokenfield* pt);
bool CondLineJudge(ERR &err, AsmLine* line);
ERR CommandLineToAsmL();
int8u GetDataType(Tokenfield* p);
void TknIsDBDoSth(Tokenfield* pt);
void TknIsDWDoSth(Tokenfield* pt);
// ----------- Code Generaing -------------
ERR OPAct_BRef_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv);
ERR OPAct_Wrel_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv);
ERR OPAct_H8L8_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv);
ERR OPAct_H3L8_Do(int16u loc, Dat4ary &dary, const TriVal &trv);
ERR DBToDBObj(Tokenfield* pt);
ERR DWToDWObj(Tokenfield* pt);
ERR OpandAction(Dat4ary &dary, int8u pos, TriVal* trv, int8 act);
ERR OpndExpTypCal(Tokenfield* pt, TriVal const* &t, int8u &ch);
OPset* FindResvInstOPset(Tokenfield* pt, ERR &err);
ERR Translate(Tokenfield* pt);
ERR Cal_rel(int16u addr,int8u &val);
// ---------- 代码优化 -----------------
void RecgJMPandCALL(Tokenfield* pt, OPset* &opset);
// -----------------------------------------------------------
public:
MacroAsmber(int argc, char** argv); // constructor
~MacroAsmber(); // destructor
// -------- public functions ----------
ERR AssembleFile(const Jstring& FileNam);
// ----------- Lex & Parser ------------
// 词法分析器起点。
ERR FileToToken();
// 语法分析器起点。
ERR AsmFileParse(); // Fn置初值。Ln被修改。
// 汇编行语法分析器。(用作被AsmFileParse()调用。)
ERR AsmLineParse(AsmLine* &line); // Ln被修改。
// ----------- Meaning Translation -------------
// 语义分析器起点。
ERR MeaningTrans();
// 汇编行语义分析器。
ERR AsmLineMeaningAct();
// --------- OBJrecord Translation -------------
void GenOBJFile();
void ShowOBJcodeLine(const char* textbuf, int8u &state, FILE* tp);
// 汇编行目标代码生成器。
ERR LineToObjCode();
ERR FileToObjCode();
void GenListFile();
// --------- 错误信息输出 -------------
// 输出警告信息。
void OutWarning(int8u warn);
// 输出错误信息。
void OutputErr(int8u errno);
// 取得错误总数。
int16u GetErrorSum() { return AsmFn->ErrorSum(); } //
// 取得警告总数。
int16u GetWarningSum() { return AsmFn->WarningSum(); } //
Jstring& GetOBJfileName() { return objFilePt->FileName; } //
Jstring& GetLSTfileName() { return LstFilePt->FileName; } //
Jstring& GetPname() { return Pname; } //
// ----------- 数据区 ----------------
static class SpecialRegs SRegAddr[65]; // 特殊功能寄存器描述。
// -------- friend menbers -----------
friend class LabelManager;
friend class MacrosManager;
friend class OBJmodule;
friend class LISTFile;
}; // end class MacroAsmber
//---------------------------------------------------------------------------
//------ 析构器 -------------------------------------------------------------
inline MacroAsmber::~MacroAsmber()
{ delete objFilePt;
delete LstFilePt;
delete AsmFn;
delete JModulePt;
delete MvList;
delete MacroMger;
delete Instm;
delete LabMger;
} // destructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// IfElseNest计算器加一。
// 需要使用Ln。如果出错, 会在该汇编行报错。
//---------------------------------------------------------------------------
inline void MacroAsmber::IfElseNest_inc(ERR &err)
{ if(++IfElseNest > MaxIfElseNest) // 计算器加一
{ OutputErr(IfElseNestOutErr); err = Have_Errs; } // endif
else
{ err = OK_no_Err; } // end else
} // end IfElseNest_inc
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// IfElseNest计算器减一。
// 需要使用Ln。如果出错, 会在该汇编行报错。
//---------------------------------------------------------------------------
inline void MacroAsmber::IfElseNest_dec(ERR &err)
{ if(--IfElseNest < 0) // 计算器减一
{ OutputErr(ENDIFMisplaceErr); IfElseNest = 0; err = Have_Errs; } // endif
else
{ err = OK_no_Err; } // end else
} // end IfElseNest_inc
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define Pass_1 Pass
#define Pass_2 !Pass
//---------------------------------------------------------------------------
#define Variable_ true
#define Constant_ false
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define ErrInLabelDef 1
#define ErrInAddLabel 2
#define ErrInSetLabel 3
#define ErrInORGset 4
#define ErrInExtLabel 5
#define ErrInResvInst 6
#define ErrInPublicDef 7
#define ErrInSegmentDef 8
#define ErrInRSEGset 9
#define ErrInCSEGset 10
#define ErrInDSEGset 11
#define ErrInXSEGset 12
#define ErrInISEGset 13
#define ErrInBSEGset 14
#define ErrInUsing 15
#define ErrInIfElseS 16
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -