📄 masmber_c1.cpp
字号:
//---------------------------------------------------------------------------
//-------- MAsmber_C1.cpp ----------------------------------------------------
//---------------------------------------------------------------------------
#include "MAsmber_H.h"
#include "InstSystem_H.h"
#include "AsmF_H.h"
#include "MacroManager_H.h"
#include "OBJModule_H.h"
//---------------------------------------------------------------------------
//
// 词法分析器
//
//---------------------------------------------------------------------------
#define DebugKit(str) //DebugMsg(str)
//---------------------------------------------------------------------------
// 动作:把org的Token进化到des,Token2赋值为tkn,不添加新结点。
// 尾结点不是org,报错err。
//---------------------------------------------------------------------------
#define TailTkToTk(org,des,tkn,err); \
if(Ln->tail->Token == org) \
{ Ln->tail->Token = des; \
Ln->tail->Token2 = tkn; \
return; } \
else \
{ OutputErr(err); tokn = NormalERR; break; }
//---------------------------------------------------------------------------
// 把Token进化到SEGMTDefkn。遇到"SEGMENT"指令时才做。
//---------------------------------------------------------------------------
#define SEGMT_do(); \
if(Ln->tail->Token == WordSToken) \
{ Ln->tail->Token = SEGMTDefkn; \
Ln->tail->Token2 = SEG_CODE; \
Ln->tail->loc[1] = SEG_UNIT; \
return; } \
else \
{ OutputErr(SEGDefNullErr); tokn=NormalERR; break; }
//---------------------------------------------------------------------------
#define EXTRN_do(); \
Ln->HeadToken() = EXTRNKn; return;
//---------------------------------------------------------------------------
#define NUMBER_do(); \
if(Ln->HeadToken() == EXTRNKn) \
{ Ln->AddTokenfield(EXTRNKn,word,LB_NUM); return; } \
TailTkToTk(WordSToken,PseudoWord,NumberDefn,NumberDefErr);
//---------------------------------------------------------------------------
// 如果尾结点是SEGMTDefkn, 添加段类型为sgd。
// 如果尾结点不是SEGMTDefkn, 作为常量定义, Token进化到tkn,不添加新结点。
//---------------------------------------------------------------------------
#define TailTkSegDefChk(val,sgd,tkn,err); \
if(Ln->HeadToken() == EXTRNKn) \
{ Ln->AddTokenfield(EXTRNKn,word,val); return; } \
if(Ln->tail->Token == SEGMTDefkn) \
{ Ln->tail->Token2 = sgd; \
Ln->tail->loc[1] = SEG_UNIT; \
return; } \
TailTkToTk(WordSToken,PseudoWord,tkn,err);
//---------------------------------------------------------------------------
// 如果尾结点是SEGMTDefkn, 添加再定位类型为rel。否则报错SegRelDefErr。
//---------------------------------------------------------------------------
#define TailTkSegDefRel(rel); \
if(Ln->tail->Token == SEGMTDefkn) \
{ Ln->tail->loc[1] = rel; return; } \
else \
{ OutputErr(SegRelDefErr); tokn=NormalERR; break; }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 对于输入的一个Token,决定它是被添加到Ln链表,还是与前Token合并成另一个Token。
// 又或者是忽略该Token。
//---------------------------------------------------------------------------
void MacroAsmber::ActToken(int16u tokn, const Jstring& word,int32u val)
{ switch(tokn)
{ case PseudoWord:
{ switch( (int16u)val ) // Token2
{ case CODE : { TailTkSegDefChk( LB_CODE, SEG_CODE, CODEDefKen,
CODEDefNullErr); } // end case
case DATA : { TailTkSegDefChk( LB_DATA, SEG_DATA, DATADefKen,
DATADefNullErr); } // end case
case BIT : { TailTkSegDefChk( LB_BIT, SEG_BIT, BITsDefken,
BITDefNullErr); } // end case
case XDATA: { TailTkSegDefChk( LB_XDATA, SEG_XDATA, XDATADefKn,
XDATADefNullErr); } // end case
case IDATA: { TailTkSegDefChk( LB_IDATA, SEG_IDATA, IDATADefKn,
IDATADefNullErr); } // end case
case NUMBER : { NUMBER_do(); } // end case
case SEGMT : { SEGMT_do(); } // end case
case EXTRNKn : { EXTRN_do(); } // end case
case UNITKn : { TailTkSegDefRel(SEG_UNIT); } // end case
case BITABLE : { TailTkSegDefRel(SEG_BITABLE); } // end case
case PAGEKn : { TailTkSegDefRel(SEG_PAGE); } // end case
case INPAGEKn : { TailTkSegDefRel(SEG_INPAGE); } // end case
case OVERABLE : { TailTkSegDefRel(SEG_BITABLE); } // end case
case INBLOCKKn: { TailTkSegDefRel(SEG_INBLOCK); } // end case
case _AT_ : { return; } // end case 忽略该单词"AT"。
case EQU : { TailTkToTk( WordSToken, PseudoWord,
EQUsDefken, EQUDefNullErr); } // end case
case SET : { // 如果是宏SET...
if(Ln->HeadToken() == MacroCTRLn) { break; } // endif
// 不是宏SET
Ln->HeadToken() = SETsDefken; // 打上一个标记。
TailTkToTk( WordSToken, PseudoWord,
SETsDefken, SETDefNullErr); } // end case
case IF_Kn: case ELSE_Kn: case ELSEIF_Kn: case ENDIF_Kn:
{ Ln->HeadToken() = (int16u)val; break; } // 打上一个标记。
// 如果不止以上指令, 可继续添加.
default : {} // end default
} // end switch( val )
break;
} // end case PseudoWord
case ':' : { TailTkToTk(WordSToken, LabelDefkn,
Ln->LineNo, LabelDefNullErr ); } // end case
case CharDatan : { Ln->AddTokenfield(ValueToken,"'"+word+"'",CharStrToint8(word));
return; } // end case
case LongCharn : { val = (int32u) new JdatBlock(word,0);
Ln->AddTokenfield(tokn, "'"+word+"'", val);
return; } // end case
case StrDataKn : { val = (int32u) new JdatBlock(word,1); break; } // end case
case MacroPsw :
{ switch( (int16u)val ) // Token2
{ case MACROTkn:
{ Ln->HeadToken() = MacroDefkn; // 打上一个标记
TailTkToTk(WordSToken, MacroDefkn, 0, MacroDefNullErr);
} // end case
case ENDMTkn :
{ OutputErr(ENDMNotMatchErr); tokn = NormalERR; break; } // end case
case LOCALTkn:
{ OutputErr(MacroLocalErr); tokn = NormalERR; break; } // end case
case EXITMTkn:
{ tokn = EXITMTkn; break; } // end case
// { OutputErr(MacroExitmErr); tokn = NormalERR; break; } // end case
case REPTTkn : { tokn = REPTTkn; break; } // end case
case IRPTkn : { tokn = IRPTkn; PureText = true; break; } // end case
case IRPCTkn : { tokn = IRPCTkn;PureText = true; break; } // end case
default : { EThrows(printf("\nUnknown macro instruction, ActToken out of run!"); Waitkey;) }
} // end switch
break;
} // end case
case '$' :
{ if(Ln->TknListEmpty()) { Ln->HeadToken()=MacroCTRLn; return; } // endif
// 如果‘$’出现在汇编行的行首,宏控制MacroCTRLn不添加。
break;
} // end case
case Dog_Ctrl:
{ PureText = true; Ln->AddTokenfield(tokn, "", val);
switch((int16u)val)
{ case IF_Tn: case ENDIF_Tn: case ELSE_Tn: case ELSEIF_Tn:
{ Ln->cond = true; } // end case
} // end switch
return; } // end case
case DogCtrlAgv:
{ if(Ln->tail->Token == Dog_Ctrl)
{ Ln->tail->Name = word; Ln->tail->Name.NoBlankInStr(); return; } // endif
else
{ OutputErr(ArguExcevErr); tokn = NormalERR; break; } // end else
} // end case
case NULTkn:
{ if(Ln->tail->Token == PseudoWord && Ln->tail->Token2 == IF_Kn)
{ Ln->tail->Token2 = IFNUL_Kn; return; } // endif
else
{ OutputErr(NULnotFloIFErr); tokn = NormalERR; break; } // end else
} // end case
default : {} //
} // end switch(tokn)
Ln->AddTokenfield(tokn, word, val); // 默认动作
} // end ActToken
//---------------------------------------------------------------------------
#undef TailTkToTk(org,des,tkn,err);
#undef SEGMT_do();
#undef EXTRN_do();
#undef NUMBER_do();
#undef TailTkSegDefChk(sgd,tkn,err);
#undef TailTkSegDefRel(rel);
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 单词和数串转化为Token 单词会转为大写,并加进Ln汇编行的Token表。
// 如果单词是保留字或特殊符号, 把它的Type作为Token,
// 把代表该保留字的Token作为val送入ActToken. word 受影响。
// err = 0, 正确。 err = 1, 数据超界!
//---------------------------------------------------------------------------
ERR MacroAsmber::NumWordToToken(Jstring &word)
{ int32u val;
if( word.ValueStrToValue(val) ) // 是数字!作为数据Token添加。
{ Ln->AddTokenfield(ValueToken, word, val); } // endif
// 以上是数值单词处理
else // 不是数字,而是单词,构造单词串Token。
{ word.ToUp(); // 单词要先转为大写
// 把这个单词识别一下
int16u typ;
int16u tok = InstSystem::InsRecg(word, typ, Ln->HeadToken()==MacroCTRLn);
// 它是保留字或者特殊符号吗?
if(tok == NULL || ( typ == Dog_Ctrl && Ln->HeadToken()!= MacroCTRLn) )
{ Ln->AddTokenfield(WordSToken, word, NULL); } // endif
// 不是保留字或特殊符号, 看成是WordSToken,添加到Token链表。
else // 是保留字或特殊符号, 把它的Type作为Token,把代表该保留字的Token作为val送入ActToken.
{ ActToken(typ,word,tok); } // end else
} // end else
return OK_no_Err;
} // end NumWordToToken
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//#define MovFvd(x) { register char* p=(x); while(*p) {*(p-1)=*(++p);} }
//---------------------------------------------------------------------------
// 输入p, p不能是空!!
// 调用后word返回单词, behind指向单词后一个字符。
// 返回Token.
//---------------------------------------------------------------------------
// 向前扫描若干字符,从中找出特定结束符. 把指针 p 移到该结束符的后面.
#define MatchTnCh(p,ch,err); \
++(p); for( ; ; ) \
{ if(*(p) == ch) \
{ if(p[1]==ch) { (p)+=2; } else { ++(p); break; } } \
else \
{ if(*(p) == '!') { ++p; } \
if(*(p) =='\0') { OutputErr(err); return NormalERR; } \
else { ++(p); } \
} \
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// 先把behind指向的字符"吃掉", 然后返回tok.
#define EatReturn(tok) { ++behind; return (tok); }
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// 先把从behind指向的字符直到行末都"吃掉", 然后返回tok.
// while (*++behind); <==> while( *behind!='\0' )
#define LtnReturn(tok) { while (*++behind); return (tok); }
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int16u MacroAsmber::GetSymWord(char* p, Jstring &word, char* &behind)
{ MovePoint(p); // Now, p指向文本行中的第一个可见符,或者行末
behind = p; // Now, behind 指向文本行中的第一个可见符,或者行末
word.Removal(); // word 的初始化
switch(*p)
{ case ',': /*逗号*/ case '#': /*井号*/ case '@': /*间接寻址*/
case '+': /* 加 */ case '-': /* 减 */ case ':': /*冒号*/
case '=': /*等于*/ case '|': /* OR运算*/ case '^': /*XOR运算*/
case '%': /* 取模运算 */ case '~': /* NOT 运算*/ case ')': /*右括号*/
case '.': /* 点运算 */ case '$': /*lc 地址*/
EatReturn(*p) // 原样返回.
case '(': /* 左括号 */
if(!PureText) EatReturn(*p) // 原样返回.
MatchTnCh(behind, ')', ParaMissRtErr)
word.Loadstr(p+1, behind - p -2);
return DogCtrlAgv; // (string)
case '!' : /* 转义字符*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -