📄 masmber_c2.cpp
字号:
//---------------------------------------------------------------------------
//-------- MAsmber_C2.cpp ---------------------------------------------------
//---------------------------------------------------------------------------
#include "MAsmber_H.h"
#include "InstSystem_H.h"
#include "AsmF_H.h"
#include "MacroManager_H.h"
#include "OBJModule_H.h"
#include "LISTfile_H.h"
//---------------------------------------------------------------------------
//
// 语法分析器
//
//---------------------------------------------------------------------------
#define DebugKit(str) //DebugMsg(str)
//---------------------------------------------------------------------------
// 汇编行过滤。
// 对当前所处的状态做一个判断,判定该汇编行是否应该进行汇编。
// 返回值为true是应该汇编,返回false就是要丢弃。err值带值返回。
// 如果有err,则主调用程序应立刻放弃汇编。
//---------------------------------------------------------------------------
#define IFwentWrongCond(er) \
if(IfElseNest == 0) \
{ OutputErr(er); err = Have_Errs; return false; } \
return true;
//---------------------------------------------------------------------------
bool MacroAsmber::CondLineJudge(ERR &err, AsmLine* line)
{ err = OK_no_Err;
if(line->cond) { return true; } // endif
switch(line->HeadToken()) // IF等语句的过滤器
{ case IF_Kn: { return true; } // end case
case ELSEIF_Kn: { IFwentWrongCond(ESIFMisplaceErr); } // end case
case ELSE_Kn: { IFwentWrongCond(ELSEMisplaceErr); } // end case
case ENDIF_Kn: { IFwentWrongCond(ENDIFMisplaceErr);} // end case
default: {} // end default
} // end switch
if(MroIfStack.GetXorTop() || IfStack.GetXorTop()) // 判断是否接纳该汇编行
{ DebugKit(printf("\nThis line be banned!"); Debugkey;); // debug
line->Enable = false; // !!!!!!!
line->Unsm = true; // !!!!!!!
if(noCond) { line->hideln = true; } // endif
return false; // 汇编行被丢弃。
} // endif
DebugKit(printf("\nThis line be accepted!");) // debug
return true; // 汇编行被接纳。
} // end CondLineJudge
//---------------------------------------------------------------------------
#undef IFwentWrongCond
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
/* AsmLine Parse:
* 空行
* LabelDef
* [LabelDef] Instruction
* [LabelDef] PseudoInst */
//---------------------------------------------------------------------------
#define ParseOK 0
#define ParseErr 1
//---------------------------------------------------------------------------
#define ExternVarParse(); \
for( ; pt && pt->Token == EXTRNKn; pt = pt->next) \
{ TokenOper::CalWordNumAndPack(pt, err); \
if(err) { OutputErr(err); err = Have_Errs; break; } \
} \
if(!err && pt) \
{ if(pt->Token == ',') { OutputErr(ExcesComErr); } \
else { OutputErr(ArguExcevErr); } \
err = Have_Errs; \
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 跳过内容,直到ENDM。
//---------------------------------------------------------------------------
#define IFerrIgnoreMacro(); \
if(err) \
{ for( ; line->HeadToken() != ENDMTkn; line = line->next); \
line->Enable = false; \
return Have_Errs; \
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 注意,把待处理的汇编行放到Ln上。
//---------------------------------------------------------------------------
ERR MacroAsmber::AsmLineParse(AsmLine* &line)
{ // 如果该汇编行被禁用的话,不作语法分析。
if( !line->LineIsEnable() ) { return OK_no_Err; } // endif
ERR err = OK_no_Err;
DebugKit(printf("\nParsing Line %d:", line->LineNo); line->show(); Debugkey;); // debug
if(!CondLineJudge(err, line)) { return err; } // endif
// Now, 通过了过滤器。
switch(line->HeadToken())
{ case MacroCTRLn: { err = DogCtrlParse(line); return err; } // end case
case MacroDefkn: { err = MacroMger->MacroRegister(line); // 该函数会影响line。
return err; } // end case
case END : { return OK_no_Err; } // Only to pass the parse, saying all right!
// no default...
} // end switch
Tokenfield* pt = line->FirstTkn(); // point to the first node.
if(pt->Token == LabelDefkn) { pt = pt->next; } // endif
// 分析第一个Token。成功通过.
if(pt == NULL) { return OK_no_Err; } // Only have Label defination, No error.
switch(pt->Token)
{ case ReservInst : { err = ResvInstParse(pt); // 调用保留字操作语法分析,根据错误报错。
return err;
} // end case
case PseudoWord : { err = PsdoWordParse(pt); // 把当前的pt传给伪指令语法分析程序。
return err;
} // end case
case SEGMTDefkn : { if(pt->next)
{ OutputErr(ArguExcevErr); err = Have_Errs; } // endif
return err; // Only to pass the parse, saying all right!
} // end case
case EXTRNKn : { ExternVarParse(); // 宏调用
return err;
} // end case
case REPTTkn : { err = MacroMger->MacroREPTdo(line); // 结束时line指向ENDM。
IFerrIgnoreMacro(); // 跳过内容,直到ENDM。
return err;
} // end case
case IRPTkn : { err = MacroMger->MacroIRP_do(line); // 结束时line指向ENDM。
IFerrIgnoreMacro(); // 跳过内容,直到ENDM。
return err;
} // end case
case IRPCTkn : { err = MacroMger->MacroIRPC_do(line); // 结束时line指向ENDM。
IFerrIgnoreMacro(); // 跳过内容,直到ENDM。
return err;
} // end case
case LOCALTkn : { OutputErr(LocaltNotAllowErr); // Just for Debug!!
err = Have_Errs; return err; } // end case
case EXITMTkn : { err = MacroEXITM_Do(line);
return err; } // end case
// ......还有什么指令,都写到这里来啊!
case NormalERR : { err = Have_Errs; return err; } // end case
case WordSToken : { // 搜寻是否有其宏名
if( !Dismacro && MacroMger->IsMacroAndParse(err, pt) )
{ if(!err) // No error and Have this macro
{ err = MacroMger->MacroCall(line); } // 宏展开!
return err;
} // endif
// no breaking...! It is not a Macro Name, error...
} // end case
default : { OutputErr(InstNeededErr); err = Have_Errs; } // end default
} // end switch
return err;
} // end AsmLineParse
//---------------------------------------------------------------------------
#undef IFerrIgnoreMacro()
//---------------------------------------------------------------------------
// 汇编源文件语法分析
// 返回erra =0 是没有语法错误。返回 1 就有语法错误。
// 流程:
// (1)初始化。
// (2)对每一行,进行语法分析。
// (3)如果无错,进行语义分析(预备)。
// (4)这次语义分析中发生的错误会被忽略。
// (5)循环。
//---------------------------------------------------------------------------
ERR MacroAsmber::AsmFileParse()
{ ERR erra = OK_no_Err;
Pass = true; // 第一遍扫描
IfElseNest = 0; // IF ELSE 嵌套计数器清零。
MroIfNest = 0; // $IF $ELSE 嵌套计数器清零。
SegPt = JModulePt->SegDefHead; // 给当前段指针赋初值, 指向默认段
for( Ln = AsmFn->FirstLine(); Ln; Ln = Ln->next )
{ // ...........................................................
Ln->sgpt = SegPt; // This is done in Pass1! Not in Pass2!
Ln->lc = SegPt->SegLc; // This value is noly to speculate.
// 第一遍扫描,汇编行的所属段指针sept指向当前段。但lc值未确定。
if( AsmLineParse(Ln) )
{ erra = Have_Errs;
DebugKit(printf("\t...Line %d parse err.", Ln->LineNo); WaitEnter; );
} // endif
// ...... 上一步如果有错,下一步不做。 ........
if(!erra) // Pass1 忽略一部分错误!
{ DebugKit(ERR err =) AsmLineMeaningAct();
DebugKit( if(err) { printf("\n\n==>Err in Pass1(err=%d)\n",err); WaitEnter; } ); // debug
} // endif
// ...........................................................
} // endfor
if(IfElseNest != 0 || MroIfNest != 0) // 如果IF与ENDIF不配对的话
{ Ln = AsmFn->Tail; OutputErr(MissingENDIFErr); erra = Have_Errs; } // endif
// 查看IF和ENDIF是否配对。
return erra;
} // end AsmFileParse
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 伪代码的语法分析 pt->Token == PsdoWord
// 正确返回零, 错误返回错误码
//---------------------------------------------------------------------------
#define NeedOneExp(); \
count = TokenOper::CalExpNum(pt, err); \
if(err) { OutputErr(err); return ParseErr; } \
switch(count) \
{ case 0 : OutputErr(ArguInsufErr); return ParseErr; \
case 1 : return ParseOK; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -