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

📄 tokenoper_h.h

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 H
字号:
//---------------------------------------------------------------------------
//  TokenOper_H.h
//---------------------------------------------------------------------------
#ifndef	TokenOper_H.h  // 防止被重复引用
#define TokenOper_H.h
//---------------------------------------------------------------------------

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

//---------------------------------------------------------------------------
class TokenOper : public JObject
{ public:
     // 把pt所指向的节点删除。
     static  void DelTokenNode(Tokenfield* &pt);

     // 把pt->next所指向的节点删除。
     static  void DelnextTokenNode(Tokenfield* pt);

     // 把以pt所指的结点开头的Token表删除。
     static  void DelTokenList(Tokenfield* &pt);

     // 把pt所指的下层Expression结点删除。
     static  void DelExpTkn(Tokenfield* pt);

     // 把pt所指的OPerand表达式(#+Expr)删除。
     static  void DelOPNDTkn(Tokenfield* pt);

     // 把以pt所指的结点开头的Operand表(必须全都是Operand)删除。
     static  void DelOPNDList(Tokenfield* pt);


     // 判断pt->next是否操作数,是则把它转为OPadToken, 即令pt->next=OPadToken.
     static   ERR OPadToPack(Tokenfield* pt);

     // 判断pt->next是否表达式,是则把它归约为ExpToken, 即令pt->next=ExpToken.
     static   ERR ExpToPack(Tokenfield* pt);

     // 该函数返回 "p->next" 的操作数个数(可以是零), 各个操作数以','作为分隔.
     static  int8 CalOPadNum(Tokenfield* pt, ERR &err);

     // 返回 "p->next" 的表达式个数, 各个表达式以','作为分隔.
     // 这里的表达式包括数值表达式, 字符, 字符串.
     static  int8 IsCExpList(Tokenfield* pt, ERR &err);

     // 返回 "p->next" 的数值表达式个数, 各个表达式以','作为分隔.
     static  int8 CalExpNum(Tokenfield* pt, ERR &err);

     // 判断p指向的结点是否为一个表达式,返回表达式长度len. 如果正确, len>0.
     static  int8 FetchOpadLen(Tokenfield* pt, ERR &err);

     // 判断p指向的结点是否为一个表达式,返回表达式长度len. 如果正确, len>0.
     static int8u FetchExpLen(Tokenfield* &p,ERR &err);

     // 把pt->next所指的Token为起点, 长度为len的一个表达式封装为表达式包(ExpToken).
     static  void ExpToToken(Tokenfield* pt, int8u len);

     // 把pt->next所指的Token为起点的带@,#,/,等的表达式封装为操作数包,成为OPADtoken.
     static  void OPadToToken(Tokenfield* pt, int8u len);

     // 计算pt->next所指的Token为起点的WordsToken串的长度。pt不能为空。注意pt带值返回。
     static  int8 CalWordNum(Tokenfield* &pt, ERR &err);

     // 把pt->next所指的Token为起点的长度为len的WordList封装为WordList。
     static  void WordListToToken(Tokenfield* pt, int8u len);

     // 把pt->next所指的Token为起点, 长度为len的一个表达式封装为WordList.
     // 该WordList用()括住。返回WordList长度。
     static  int8 CalWordNumAndPack(Tokenfield* &pt, ERR &err);

     // pt + ',' + word   word不能是保留字或其他符号。
     static   ERR ArgvWordParser(Tokenfield* pt);

     // pt + ',' + word [ = Value ] word不能是保留字或其他符号。
     static   ERR ArgvWordEvluParser(Tokenfield* pt);


     // 在一个Token链表中寻找含有指定名字的Token。
     static Tokenfield* SearchToken(Tokenfield* head, const Jstring& fname);

     // 检查从lpt指向的Token链开始到pt之前的结点的Name是否与pt所指向的Name相同。
     static  bool HaveArguName(Tokenfield* lpt, Tokenfield* pt);

  // --------------------
     static  void showTknList(Tokenfield* pt);

}; // end TokenOper
//---------------------------------------------------------------------------



/****************************************************************************
*                       下面是实现部分                                      *
*****************************************************************************/

//---------------------------------------------------------------------------
// 把pt所指向的节点删除。pt移到pt->next。pt本身改变。(吐故纳新!)
//---------------------------------------------------------------------------
inline void TokenOper::DelTokenNode(Tokenfield* &pt)
{ if(pt != NULL)
   { register Tokenfield* temp = pt; pt = pt->next; delete temp; } // endif
  // 如果pt==NULL,什么都不做。
} // end DelTokenNode
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 把pt->next所指向的节点删除。
//---------------------------------------------------------------------------
inline void TokenOper::DelnextTokenNode(Tokenfield* pt)
{ if(pt != NULL)    // 如果所要删除的节点不为空
   { DelTokenNode(pt->next); } // endif
  // 所要删除的节点竟然为空!
} // end DelnextTokenNode
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 把pt所指的下层Expression结点删除(只删一个), 并置pt->ExpPt = NULL。
// 注意,pt->Token == ExpresnKn. pt 不能为空!
//---------------------------------------------------------------------------
inline void TokenOper::DelExpTkn(Tokenfield* pt)
{ DelTokenList(pt->ExpPt); 
} // end DelExpTkn
//---------------------------------------------------------------------------


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



⌨️ 快捷键说明

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