📄 masmber_c2.cpp
字号:
default : OutputErr(ArguExcevErr); return ParseErr; \
}
//---------------------------------------------------------------------------
#define NeedCExpList(); \
count = TokenOper::IsCExpList(pt, err); \
if(err) { OutputErr(err); return ParseErr; } \
switch(count) \
{ case 0 : OutputErr(ArguInsufErr); return ParseErr; \
default : return ParseOK; \
}
//---------------------------------------------------------------------------
#define Need01Exp(); \
count = TokenOper::CalExpNum(pt, err); \
if(err) { OutputErr(err); return ParseErr; } \
switch(count) \
{ case 0 : case 1 : return ParseOK; \
default : OutputErr(ArguExcevErr); return ParseErr; \
}
//---------------------------------------------------------------------------
#define NeedOneWord(); \
count = TokenOper::CalWordNum(pt, err); \
if(err) { OutputErr(err); return ParseErr; } \
if(pt) { OutputErr(ArguExcevErr); return ParseErr; } \
switch(count) \
{ case 0 : OutputErr(ArguInsufErr); return ParseErr; \
case 1 : return ParseOK; \
default : OutputErr(ArguExcevErr); return ParseErr; \
}
//---------------------------------------------------------------------------
#define NeedWordList(); \
Tokenfield* npt = pt; \
count = TokenOper::CalWordNum(npt, err); /*带err值返回*/ \
if(err) { OutputErr(err); return ParseErr; } \
if(npt) { OutputErr(ArguExcevErr); return ParseErr; } \
if(count == 0) \
{ OutputErr(ArguInsufErr); return ParseErr; } \
TokenOper::WordListToToken(pt, count); \
return ParseOK;
//---------------------------------------------------------------------------
#define NeedZeroExp(); \
if(pt->next == NULL) { return ParseOK; } \
else { OutputErr(ArguExcevErr); return ParseErr; }
//---------------------------------------------------------------------------
// 伪指令语法分析器。
// 要使用Ln。
//---------------------------------------------------------------------------
ERR MacroAsmber::PsdoWordParse(Tokenfield* pt)
{ ERR err = OK_no_Err; int8 count; // 公用变量。
switch(pt->Token2) // Token为PseudoWord的节点,其命令字在Value中。
{ case ORG : // ORG Parse: ORG ValueExpr
case EQUsDefken: case SETsDefken: case BITsDefken:
case CODEDefKen: case DATADefKen: case XDATADefKn:
case IDATADefKn: case DS : case DBIT :
case USINGTkn : { NeedOneExp(); } // end case
case DB: case DW:
{ NeedCExpList(); } // end case
case CSEG: case DSEG: case XSEG: case ISEG: case BSEG:
{ Need01Exp(); } // end case
case RSEG: case NAMEToKn:
{ NeedOneWord(); } // end case
case PUBLICKn: { NeedWordList(); } // end case
case IF_Kn: case ELSEIF_Kn:
{ if(Ln->FirstTkn() != pt) // 一行应只有一个IF等指令。
{ OutputErr(ExcvPswWordErr); return ParseErr; } // endif
NeedOneExp(); // 需要一个数值表达式。
} // end case
case ENDIF_Kn: case ELSE_Kn:
{ if(Ln->FirstTkn() != pt) // 一行应只有一个IF等指令。
{ OutputErr(ExcvPswWordErr); return ParseErr; } // endif
NeedZeroExp(); // 不需要数值表达式。
} // end case
case IFNUL_Kn: { if(Ln->FirstTkn() != pt) // 一行应只有一个IF等指令。
{ OutputErr(ExcvPswWordErr); return ParseErr; } // endif
if(pt->next != NULL) // IF NUL xxyy
{ pt->Token2 = IF_Kn;
register Tokenfield* p = pt->next;
p->Token = ValueToken; p->Value = 0; p->Name.Removal();
TokenOper::DelnextTokenNode(p);
} // endif
else // IF NUL
{ pt->Token2 = IF_Kn;
Ln->AddTokenfield(ValueToken, NULL, 1);
} // end else
NeedOneExp(); // 需要一个数值表达式。
} // end case
// If there are more P_words, to be written here.
default : { OutputErr(UnkPWordErr); return ParseErr; } // end default
} // end switch
} // end PsdoWordParse
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 汇编指令语法分析器。
//---------------------------------------------------------------------------
ERR MacroAsmber::ResvInstParse(Tokenfield* pt)
{ int8 argvsum = InstSystem::InstArgvSum( pt->Token2 ); // 取得该指令所带的操作数个数(0~3).
//pt->show(); printf("\n Argv sum Needed = %d.",argvsum); Debugkey;
ERR err;
int8 count = TokenOper::CalOPadNum(pt, err); // 获取操作数的个数
// 对该过程中产生的错误进行解释.
if( err ) { OutputErr(err); return ParseErr; } // endif
// 如果没有错误, 比较所取得的操作数个数是否与规定的一致.
if(argvsum == count)
{ //DebugMsg(cout<<"\nResvInstParse Parse ok!";) Debugkey;
return ParseOK; // no error
} // endif
// Now, 所取得的操作数个数与规定的不一致! 有错!
if(count < argvsum) { OutputErr(ArguInsufErr); } // endif
else { OutputErr(ArguExcevErr); } // end else
return ParseErr; // have error!
} // end ResvInstParse
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
ERR MacroAsmber::MacroEXITM_Do(AsmLine* &Ln)
{ ERR err = OK_no_Err;
Ln->Enable = false;
Ln = Ln->next; // Ln->next 不可能为空。
if(Ln->NestNo > 0)
{ for( register int16u n = Ln->NestNo;
Ln->NestNo >= n;
Ln = Ln->next )
{ switch(Ln->HeadToken())
{ case IF_Kn :
{ IfElseNest_inc(err);
if(err) { return Have_Errs; } // endif
break;
} // end case
case ENDIF_Kn:
{ IfElseNest_dec(err);
if(err) { return Have_Errs; } // endif
break;
} // end case
default : {} // end default
} // end switch
Ln->Enable = false; Ln->Unsm = true; Ln->hideln = true; // 该行不汇编。
} // end for
} // endif // 上面改变了Ln!!!!!
else // EXITM 处在最外层,出错。
{ OutputErr(MacroExitmErr); err = Have_Errs; } // end else
return err;
} // end MacroEXITM_Do
//---------------------------------------------------------------------------
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Expression Parse: Priority *
* Value = Expr 12 A High *
* Word = Expr 12 | *
* $ = Expr 12 | *
* ( Expr ) = Expr 11 | *
* Expr.Expr = Expr 10 | *
* NOT Expr = Expr 9 | *
* HIGH Expr = Expr 8 | *
* LOW Expr = Expr 8 | *
* + Expr = Expr 7 | *
* - Expr = Expr 7 | *
* Expr * Expr = Expr 6 | *
* Expr / Expr = Expr 6 | *
* Expr % Expr = Expr 6 | *
* Expr + Expr = Expr 5 | *
* Expr - Expr = Expr 5 | *
* Expr SHL Expr = Expr 4 | *
* Expr SHR Expr = Expr 4 | *
* Expr AND Expr = Expr 3 | *
* Expr OR Expr = Expr 2 | *
* Expr XOR Expr = Expr 2 | *
* Expr >= Expr = Expr 1 | *
* Expr <= Expr = Expr 1 | *
* Expr = Expr = Expr 1 | *
* Expr <> Expr = Expr 1 | *
* Expr < Expr = Expr 1 | *
* Expr > Expr = Expr 1 V Low *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 8051 Instructions Line Parse: *
* [ LabelDefKn ] Instructions Operand1,Operand2[,Operand3] *
* [ LabelDefKn ] Instructions [Operand1] *
* *
* UnDefWord : = LabelDefKn *
* MOV ADD ADC XOR... = Instructions *
* *
* @ A + DPTR = Operand aA_DPTR *
* @ A + PC = Operand aA_PC *
* @Ri (i=0~1) = Operand aRi *
* Rn (n=0~7) = Operand _Rn *
* DPTR = Operand _DPTR *
* AB = Operand _AB *
* A = Operand _A *
* C = Operand _C *
* / Expr = Operand _bit *
* @ Expr = Operand *
* # Expr = Operand *
* Expr = Operand *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//---------------------------------------------------------------------------
// end MAsmber_C2.cpp
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -