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

📄 macrobodydef_h.h

📁 MCS-51单片机宏汇编器源程序,单片机初学者必看
💻 H
字号:
//---------------------------------------------------------------------------
//-------- MacroBodyDef_H.h -------------------------------------------------
//---------------------------------------------------------------------------
#ifndef	MacroBodyDef_H.h  // 防止被重复引用
#define MacroBodyDef_H.h
//---------------------------------------------------------------------------

#include "Jstring_H.h"
#include "AsmL_H.h"
#include "Tokenfield_H.h"
#include "TokenOper_H.h"
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//
//                            宏定义体
//
//---------------------------------------------------------------------------
class MacroDefBody : public JObject
{ private:
        Jstring  MacroName;        // 宏名。

        AsmLine* MacroBegin;       // 指向宏体语句,不包括MACRO, LOCAL。
        AsmLine* MacroEnd;         // 指向相应的ENDM。
     Tokenfield* arguPtr;          // 指向宏体的形式参数。
     Tokenfield* localPtr;         // 指向宏中的局部参数。
   MacroDefBody* next;             // 指向下一个结点。

  // ------- private functions ----------

  public:

     MacroDefBody(const Jstring& Mname); // constructor

    ~MacroDefBody() {}                    // destructor

  // ------- public functions -----------

    // 宏体是否为空。
    bool IsBodyEmpty()const
         { return (MacroBegin == MacroEnd); } // end IsBodyEmpty

    // 寻找形参。判别输入的名字是否为一个形参的名字。
    Tokenfield* SearchFormArgv(const Jstring& fname)const;

    // 寻找局参。判别输入的名字是否为一个局参的名字。
    Tokenfield* SearchLocalArg(const Jstring& fname)const;

    // 对其中出现的WordSToken作判别,如果是形参,改成FormalArgv。
    // 如果是局参,改成LocalArgv。
    // 把CharDatan, LongCharn, StrDataKn这些Token都改成WordSToken。
    // CLine不能是空行。
    void SearchAndRecgArgvInMro(AsmLine* CLine);

    // 设置宏头和宏尾。
    // 扫描宏体,识别其中的形参和局参,改成FormalArgv和LocalArgv。
    // CLine带值返回,返回时指向ENDM。
    void MroBodyScanAndRecg(AsmLine* &CLine);

  // ---------------------------
    void show()const;
    void showArgu()const;

  // ---------------------------
  friend class MacroRegList;
  friend class MacrosManager;
}; // end MacroDefBody
//---------------------------------------------------------------------------


//----- 构造器 --------------------------------------------------------------
inline MacroDefBody::MacroDefBody(const Jstring& Mname)
                           :MacroBegin(NULL),MacroEnd(NULL),
                            arguPtr(NULL),localPtr(NULL),
                            next(NULL)
{ MacroName = Mname;
} // end constructor
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寻找形参。
//---------------------------------------------------------------------------
inline Tokenfield* MacroDefBody::SearchFormArgv(const Jstring& fname)const
{ return TokenOper::SearchToken(arguPtr, fname);
} // end SearchFormArgv
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寻找局参。
//---------------------------------------------------------------------------
inline Tokenfield* MacroDefBody::SearchLocalArg(const Jstring& fname)const
{ return TokenOper::SearchToken(localPtr, fname);
} // end SearchLocalArg
//---------------------------------------------------------------------------



//---------------------------------------------------------------------------
//
//                            宏定义表
//
//---------------------------------------------------------------------------
class MacroRegList : public JObject
{ private:
    MacroDefBody* head;          // 链头。

  public:
    MacroRegList():head(NULL) {} // constructor

   ~MacroRegList();              // destructor

  // ------ public functions ---------

    // 从表头插入新变量。
    void InsertMacro(MacroDefBody* mbody);

    // 根据宏名找宏定义,找到就返回指向宏定义体的指针。找不到,返回NULL。
    MacroDefBody* SearchMacro(const Jstring& vname);

  // -------------------------
  friend class MacrosManager;
}; // end MacroRegList
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 从表头插入节点。
//---------------------------------------------------------------------------
inline void MacroRegList::InsertMacro(MacroDefBody* mbody)
{ mbody->next = head;
  head = mbody;
} // end InsertMacro
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//
//                             宏变量结点
//
//---------------------------------------------------------------------------
class MacroVarNode
{ private:
     Jstring name;          // 变量名
      int16u value;         // 变量值
    MacroVarNode* next;     // 指针

  public:
   // ------- constructor ---------

    // -------- 构造器1 -----------   // 注意value和next没有赋初始值。
    MacroVarNode(const Jstring& na) { name = na; } // end constructor

    // -------- 构造器2 -----------
    MacroVarNode(const Jstring& na, int16u val):next(NULL)
     { name = na; value = val; } // end constructor

   // -----------------------------
  friend class MacroVarList;
}; // end MacroVarNode
//---------------------------------------------------------------------------


#include "TriVal_H.h"
//---------------------------------------------------------------------------
//
//                            宏变量表
//
//---------------------------------------------------------------------------
class MacroVarList
{ private:
    MacroVarNode* head;           // 链头。

  // ------ private functions -------

    // 从表中搜索指定名字的变量, 返回指向该结点的指针。找不到,返回NULL。
    MacroVarNode* SearchVar(const Jstring& vname);

  public:

    MacroVarList():head(NULL) {}  // constructor

   ~MacroVarList();               // destructor

  // ------ public functions -------

    // 计算数值表达式的值。
   int32 CalVarExpr(ERR &err, Tokenfield* Pt);

    // 对操作数进行相应的运算。
     ERR OPTRAct(TokenStack &optr, ValueStack &opnd);

    // 从表头插入新变量。
    void InsertVar(const Jstring& vname, int16u val);

    // 更新或新建变量。
    void UpdateVar(const Jstring& vname, int16u val);

    // 从表中搜索变量的值。
    MacroVarNode* GetValue(const Jstring& vname, int16u &val);

  // -------------------------
    void show()const;

  // -------------------------
  friend class MacrosManager;
}; // end MacroVarList
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 从表头插入新变量。
//---------------------------------------------------------------------------
inline void MacroVarList::InsertVar(const Jstring& vname, int16u val)
{ MacroVarNode* vp = new MacroVarNode(vname);
  vp->value = val;
  vp->next = head;
  head = vp;
} // end InsertVar
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 更新或新建变量。
//---------------------------------------------------------------------------
inline void MacroVarList::UpdateVar(const Jstring& vname, int16u val)
{ MacroVarNode* mt = SearchVar(vname);
  if( mt ) // Found.
   { mt->value = val; } // endif
  else // Not found. (mt==NULL)
   { InsertVar(vname, val); } // end else
} // end UpdateVar
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 已知变量的名称,从表中搜索变量的值。
// 找到, 返回值为指向该节点的指针,val带值返回。找不到返回NULL。
//---------------------------------------------------------------------------
inline MacroVarNode* MacroVarList::GetValue(const Jstring& vname, int16u &val)
{ MacroVarNode* mt = SearchVar(vname);
  if(mt) { val = mt->value; } // endif
  return mt;
} // end GetValue
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
//               Written by JamesyFront.    ZLGmcu Dev.Co.Ltd.  2002.
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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