📄 tokenoper_h.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 + -