⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 masmber_c1.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
//-------- 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 + -