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

📄 masmber_c2.cpp

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