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

📄 macrobodydef_c.cpp

📁 MCS-51单片机宏汇编器源程序,单片机初学者必看
💻 CPP
字号:
//---------------------------------------------------------------------------
//-------- MacroBodyDef_C.cpp -----------------------------------------------
//---------------------------------------------------------------------------
#include "JsGlobal_H.h"
#include "MacroBodyDef_H.h"
#include "MAsmber_H.h"
//---------------------------------------------------------------------------
//           宏定义,宏处理
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// MacroDefBody
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 对其中出现的WordSToken作判别,如果是形参,改成FormalArgv。
// 如果是局参,改成LocalArgv。
// 把CharDatan, LongCharn, StrDataKn这些Token都改成WordSToken。
// CLine不能是空行。
//---------------------------------------------------------------------------
void MacroDefBody::SearchAndRecgArgvInMro(AsmLine* CLine)
{ for( Tokenfield* ft = CLine->FirstTkn();
           ft;
               ft = ft->next )
   { switch(ft->Token)
     { case WordSToken:
             { register Tokenfield* fer = SearchFormArgv(ft->Name);
               if(fer) // Have found out that it is a Formal argv
                { ft->Token = FormalArgv;   // Token进化!
                  ft->ExpPt = fer;          // 其指针域指向相应的形参。
                } // endif
               else    // fer == NULL
                { fer = SearchLocalArg(ft->Name);
                  if(fer)  // Have found Local Argu.
                   { ft->Token = LocalArgv; // Token进化!
                     ft->ExpPt = fer;       // 其指针域指向相应的局参。
                   } // endif
                  // no else
                } // end else
               break;
             } // end case
       case CharDatan:  case LongCharn:  case StrDataKn:
             { ft->Token = WordSToken; // 在宏中,这些Token被看成WordSToken一样。
               break;
             } // end case
       // no default...
     } // end switch
   } // end for
} // end SearchAndRecgArgvInMro
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 设置宏头和宏尾。
// 扫描宏体,识别其中的形参和局参,改成FormalArgv和LocalArgv。
// CLine带值返回,返回时指向ENDM。
//---------------------------------------------------------------------------
void MacroDefBody::MroBodyScanAndRecg(AsmLine* &CLine)
{ MacroBegin = CLine; // 得到宏体头
  for(  ;  CLine != NULL
           && CLine->HeadToken() != ENDMTkn; // 注意,用头结点作判别!
               CLine = CLine->next )
  { // 对其中出现的WordSToken作判别,如果是形参,改成FormalArgv;
    SearchAndRecgArgvInMro(CLine); // 如果是局参,改成LocalArgv。
  } // end for
  // 宏体尾
  MacroEnd = CLine; // 得到宏体尾
  CLine->Enable = false; // 最后把CLine禁用。(ENDM)
} // end MroBodyScanAndRecg
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void MacroDefBody::show()const
{ printf("\nMacroBody [%s]", (const char*)MacroName);
  printf("\nMacro begin at Line[%d]", MacroBegin ? MacroBegin->GetLineNo():0);
  printf("\nMacro end at Line[%d]", MacroEnd ? MacroEnd->GetLineNo():0);
  printf("\nArgu pointing: ");
   if(arguPtr) { arguPtr->show(); } // endif
   else { printf("NULL"); } // end else
  printf("\nlocal pointing: ");
   if(localPtr) { localPtr->show(); } // endif
   else { printf("NULL"); } // end else
} // end show
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void MacroDefBody::showArgu()const
{ printf("\n---- Argu show: ----");
  for( register Tokenfield* pt = arguPtr;
           pt;
               pt = pt->next )
   { printf("\nArgu[%s]=[%s]", (const char*)pt->Name,
              pt->ExpPt ? (const char*)pt->ExpPt->Name : "nil");
   } // end for

  for( register Tokenfield* pt = localPtr;
           pt;
               pt = pt->next )
   { printf("\nLocal[%s]=[??%4.4X]",(const char*)pt->Name, pt->Value); } // end for
} // end showArgu
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// MacroRegList
//---------------------------------------------------------------------------

//----- 析构器 --------------------------------------------------------------
MacroRegList::~MacroRegList()
{ for( register MacroDefBody* temp = head;
           head;
               head = head->next,
               delete temp,
               temp = head ); // end for
} // end destructor
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 从宏定义表的表头开始,搜索指定的宏名的宏定义。
// 找不到返回NULL。
//---------------------------------------------------------------------------
MacroDefBody* MacroRegList::SearchMacro(const Jstring& vname)
{ register MacroDefBody* mbt;
  for( mbt = head;
           mbt && mbt->MacroName != vname;
               mbt = mbt->next ); // end for
  return mbt;
} // end SearchMacro
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// MacroVarList
//---------------------------------------------------------------------------

//------ 析构器 -------------------------------------------------------------
MacroVarList::~MacroVarList()
{ for( register MacroVarNode* temp = head;
           head;
               head = head->next,
               delete temp,
               temp = head ); // end for
} // end destructor
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void MacroVarList::show()const
{ printf("\n===== [MacroVarList] =====");
  for( register MacroVarNode* temp = head;
           temp;
               temp = temp->next )
   { printf("\n[%s]=%XH, %u",(const char*)temp->name, temp->value, temp->value);
   } // end for
  printf("\n===== [List end] =====");
} // end show
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 从表中搜索指定名字的变量, 返回指向该结点的指针。找不到,返回NULL。
//---------------------------------------------------------------------------
MacroVarNode* MacroVarList::SearchVar(const Jstring& vname)
{ register MacroVarNode* mt;
  for( mt = head;
           mt && vname != mt->name;
               mt = mt->next ); // end for
  return mt;
} // end SearchVar
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 计算数值表达式的值。
// err带值返回。返回的值可以直接OutputErr。
//---------------------------------------------------------------------------
#define getOpKn         OpKn = ( Pt ? Pt->Token : ' ' );
#define getNextOp       Pt = Pt->next; getOpKn
//---------------------------------------------------------------------------
int32 MacroVarList::CalVarExpr(ERR &err, Tokenfield* Pt)
{ err = 0;          // 对err清零
  TokenStack optr; ValueStack opnd;
  int16u OpKn;      getOpKn;

  while( OpKn !=' ' || optr.Notempty() )
  { if( IsOPTR(OpKn) ) // 是个运算符
     { // 已经得到一个运算符.
       switch( OPsuperior( optr.gettop(), OpKn ) )
       { case '<' : { optr.push(OpKn);              // 运算符入栈
                      getNextOp; break;
                    } // end case
         case '=' : { optr.pop();                   // 运算符出栈
                      getNextOp; break;
                    } // end case
         case '>' : { err = OPTRAct(optr, opnd); // 给err赋值
                      if(err) { EThrows(printf("\tOpAct Result err!");); return NULL; } // endif
                      break;
                    } // end case
         default : { FatalErr("\nCalVarExpr out of run!"); } // end default
       } // end switch
     } // endif IsOPTR(Token)
    else // 不是运算符, 而是操作数, 则进栈
     { switch(Pt->Token)
       { case ValueToken: { break; } // end case
         case WordSToken: { MacroVarNode* pn = SearchVar(Pt->Name);
                            if(pn == NULL) { err = LabelUnDefErr; return NULL; } // endif
                            Pt->Value = pn->value; // 取变量的值
                            break; } // end case
         default : { err = ExpSyrErr; return NULL; } // end default
       } // end switch

       opnd.push(Pt->Value);     // 入栈
       getNextOp;
     } // end else
  } // end while

  int32 val = opnd.pop(); // No error. 得到结果。

  Assert( if( Pt || !optr.empty() || !opnd.empty() )         // Just for Debug!!
           { FatalErr("\nError in OPstack!!"); } // endif
         );
  return val;
} // end CalVarExpr
//---------------------------------------------------------------------------
#undef getOpKn
#undef getNextOp
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
#define pop2opnd                                                                \
        int32 b = opnd.pop();                                                   \
        int32 a = opnd.pop();
//---------------------------------------------------------------------------
#define pop1opnd                                                                \
        int32 a = opnd.pop();
//---------------------------------------------------------------------------
#define IFDIVerZero      if(b == 0) { return DividerIsZeroErr; }
//---------------------------------------------------------------------------
// 计算数值表达式。返回的err值可以用OutputErr打印出来。
//---------------------------------------------------------------------------
ERR MacroVarList::OPTRAct(TokenStack &optr, ValueStack &opnd)
{ switch(optr.pop())
  { // 双目运算
    case '+' : { pop2opnd; opnd.push(a + b); break; } // end case
    case '-' : { pop2opnd; opnd.push(a - b); break; } // end case
    case '*' : { pop2opnd; opnd.push(a * b); break; } // end case
    case '/' : { pop2opnd; IFDIVerZero; opnd.push(a / b); break; } // end case
    case '%' : { pop2opnd; IFDIVerZero; opnd.push(a % b); break; } // end case
    case '.' : { return ComNotAllowErr; } // end case
    case AND : { pop2opnd; opnd.push(a & b); break; } // end case
    case  OR : { pop2opnd; opnd.push(a | b); break; } // end case
    case XOR : { pop2opnd; opnd.push(a ^ b); break; } // end case

    case '=' : { pop2opnd; opnd.push(a == b);break; } // end case
    case '<' : { pop2opnd; opnd.push(a < b); break; } // end case
    case '>' : { pop2opnd; opnd.push(a > b); break; } // end case

    case GRtEQUKen: { pop2opnd; opnd.push(a >= b); break; } // end case
    case LessEQUKn: { pop2opnd; opnd.push(a <= b); break; } // end case
    case NotEqual : { pop2opnd; opnd.push(a != b); break; } // end case

    case SHL : { pop2opnd;
                 if(b > 16) { return ShiftOutRangeErr; } // endif
                 opnd.push(a << b); break;
               } // end case
    case SHR : { pop2opnd;
                 if(b > 16) { return ShiftOutRangeErr; } // endif
                 opnd.push(a >> b); break;
               } // end case

    // 单目运算
    case NOT : { pop1opnd; opnd.push(~a); break; } // end case
    case HIGH: { pop1opnd; opnd.push((a & 0xff00)>>8); break; } // end case
    case LOW:  { pop1opnd; opnd.push(a & 0x00ff); break; } // end case

    case SingleNeg : { pop1opnd; opnd.push(-a); break; } // end case
    case SinglePlus: { break; } // end case

    default : { return BadOPinExprErr; } // end default
  } // end switch
 return OK_no_Err;
} // end OPTRAct
//---------------------------------------------------------------------------
#undef pop2opnd
#undef pop1opnd
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// end MacroBodyDef_C.cpp
//---------------------------------------------------------------------------
//               Written by JamesyFront.    ZLGmcu Dev.Co.Ltd.  2002.
//---------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -